У меня есть сжатое (tar), файл резервной копии, который периодически добавляется к каталогу. Файлы, которые добавляются, имеют соглашение о присвоении имен как так:
JenkinsBackup_$(date +%Y%m%d-%H%M%S).tar.gz
Который приводит к файлам, названным как:
jenkinsBackup_20170630-091543.tar.gz
Моя цель состоит в том, чтобы выбрать все файлы в рамках каталога, более старого, чем новые десять файлов, добавленных к каталогу, и удалить те файлы. По существу очистка каталога из командной строки.
Кто-либо может помочь мне с терминальными командами, должен был выполнить это? Я не уверен, как выбрать и удалить все файлы в рамках каталога, более старого, чем новые десять файлов.
Заранее спасибо за любую справку!
Простой путь, который хорошо работает с Вашими именами файлов, состоит в том, чтобы использовать:
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
Если у Вас есть доступ к 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'
Я предполагаю, что каталог содержит только Ваши резервные копии. Если это будет иметь другие файлы, то неправильные файлы будут удалены.
import os
for f in sorted(os.listdir('.'))[:-10]:
os.remove(f)
os.listdir('.')
получает имена файлов в текущем каталогеsorted()
сортирует имена файлов в порядке возрастания (самый старый первый)[:-10]
выбирает целый список кроме последних десяти объектовos.remove()
удаляет каждый файл