Удалите все файлы в рамках каталога, более старого, чем последний раз добавленные десять файлов

У меня есть сжатое (tar), файл резервной копии, который периодически добавляется к каталогу. Файлы, которые добавляются, имеют соглашение о присвоении имен как так:

JenkinsBackup_$(date +%Y%m%d-%H%M%S).tar.gz

Который приводит к файлам, названным как:

jenkinsBackup_20170630-091543.tar.gz

Моя цель состоит в том, чтобы выбрать все файлы в рамках каталога, более старого, чем новые десять файлов, добавленных к каталогу, и удалить те файлы. По существу очистка каталога из командной строки.

Кто-либо может помочь мне с терминальными командами, должен был выполнить это? Я не уверен, как выбрать и удалить все файлы в рамках каталога, более старого, чем новые десять файлов.

Заранее спасибо за любую справку!

3
задан 30 June 2017 в 17:05

3 ответа

Простой путь, который хорошо работает с Вашими именами файлов, состоит в том, чтобы использовать:

ls -t1 | tail -n +11 | xargs gvfs-rm
  • ls -t1 дает нам список файлов на основе их времени изменения, и новейшие файлы являются первыми.
  • использование tail -n +11 мы пропускаем сначала 10 строк и получаем все остальное
  • затем, мы передаем список по каналу к xargs gvfs-rm для удаления.

Примечание, что gvfs-rm перемещения файл к мусору, используйте rm для постоянного удаления их.

, Если Вы хотите работать с именами файлов вместо их времени изменения затем, используют ls -1r | tail -n +11 | xargs gvfs-rm вместо этого.

А, подобный find решение, которое решает на основе имен файлов:

find -type f | sort -r | tail -n +11 | xargs gvfs-rm

или

find -type f | sort | head -n -10 | xargs gvfs-rm
5
ответ дан 1 December 2019 в 13:16

Если у Вас есть доступ к zsh это намного легче, чем переход хотя обручи с ls, find или stat. Например, данный

 % ls -1 JenkinsBackup_*
JenkinsBackup_20170630-095544.tar.gz
JenkinsBackup_20170630-095545.tar.gz
JenkinsBackup_20170630-095546.tar.gz
JenkinsBackup_20170630-095547.tar.gz
JenkinsBackup_20170630-095548.tar.gz
JenkinsBackup_20170630-095549.tar.gz
JenkinsBackup_20170630-095550.tar.gz
JenkinsBackup_20170630-095551.tar.gz
JenkinsBackup_20170630-095552.tar.gz
JenkinsBackup_20170630-095553.tar.gz
JenkinsBackup_20170630-095554.tar.gz
JenkinsBackup_20170630-095555.tar.gz
JenkinsBackup_20170630-095556.tar.gz
JenkinsBackup_20170630-095557.tar.gz
JenkinsBackup_20170630-095558.tar.gz

Список ко времени изменения, новейшее первое использование om (порядок ко времени изменения) спецификатор шарика:

 % printf '%s\n' JenkinsBackup_*(om)
JenkinsBackup_20170630-095558.tar.gz
JenkinsBackup_20170630-095557.tar.gz
JenkinsBackup_20170630-095556.tar.gz
JenkinsBackup_20170630-095555.tar.gz
JenkinsBackup_20170630-095554.tar.gz
JenkinsBackup_20170630-095553.tar.gz
JenkinsBackup_20170630-095552.tar.gz
JenkinsBackup_20170630-095551.tar.gz
JenkinsBackup_20170630-095550.tar.gz
JenkinsBackup_20170630-095549.tar.gz
JenkinsBackup_20170630-095548.tar.gz
JenkinsBackup_20170630-095547.tar.gz
JenkinsBackup_20170630-095546.tar.gz
JenkinsBackup_20170630-095545.tar.gz
JenkinsBackup_20170630-095544.tar.gz

Список ко времени изменения, новейшему первый, и избранный от 11-го:

 % printf '%s\n' JenkinsBackup_*(om[11,-1])
JenkinsBackup_20170630-095548.tar.gz
JenkinsBackup_20170630-095547.tar.gz
JenkinsBackup_20170630-095546.tar.gz
JenkinsBackup_20170630-095545.tar.gz
JenkinsBackup_20170630-095544.tar.gz

Удалите соответствие файлам, более старым, чем 10-е новейшее:

 % rm -v JenkinsBackup_*(om[11,-1])
removed 'JenkinsBackup_20170630-095548.tar.gz'
removed 'JenkinsBackup_20170630-095547.tar.gz'
removed 'JenkinsBackup_20170630-095546.tar.gz'
removed 'JenkinsBackup_20170630-095545.tar.gz'
removed 'JenkinsBackup_20170630-095544.tar.gz'

См. zsh: 14 Расширений: Поколение Имени файла

1
ответ дан 1 December 2019 в 13:16

Python

Я предполагаю, что каталог содержит только Ваши резервные копии. Если это будет иметь другие файлы, то неправильные файлы будут удалены.

import os
for f in sorted(os.listdir('.'))[:-10]:
    os.remove(f)

Объяснение

  • os.listdir('.') получает имена файлов в текущем каталоге
  • sorted() сортирует имена файлов в порядке возрастания (самый старый первый)
  • [:-10] выбирает целый список кроме последних десяти объектов
  • os.remove() удаляет каждый файл
2
ответ дан 1 December 2019 в 13:16

Другие вопросы по тегам:

Похожие вопросы: