Допустим, у меня есть каталог, ḟoo/
который содержит много файлов в некоторой структуре каталогов. Мне нужно сохранить некоторые из них, но не все.
Есть ли способ (на месте) удалить их всех, кроме, скажем, 500 новейших?
источник
Допустим, у меня есть каталог, ḟoo/
который содержит много файлов в некоторой структуре каталогов. Мне нужно сохранить некоторые из них, но не все.
Есть ли способ (на месте) удалить их всех, кроме, скажем, 500 новейших?
Я делаю эту задачу регулярно, и я использую варианты следующего. Это конвейер, объединяющий различные простые инструменты: найдите все файлы, добавьте время модификации файла, отсортируйте, удалите время изменения файла, отобразите все строки, кроме первых 500, и удалите их:
find foo/ -type f | perl -wple 'printf "%12u ", (stat)[9]' | \
sort -r | cut -c14- | tail -n +501 | \
while read file; do rm -f -- "$file"; done
Несколько комментариев:
Если вы используете «bash», вы должны использовать «read -r file», а не «read file».
Использование «perl» для удаления файлов выполняется быстрее (а также обрабатывает «странные» символы в именах файлов лучше, чем цикл while, если только вы не используете «read -r file»):
... | tail -n +501 | perl -wnle 'unlink() or warn "$_: unlink failed: $!\n"'
Некоторые версии «tail» не поддерживают опцию «-n», поэтому вы должны использовать «tail +501». Портативный способ пропустить 500 первых строк
... | perl -wnle 'print if $. > 500' | ...
Это не будет работать, если ваши имена файлов содержат переводы строк.
Это не требует GNU найти.
Сочетание вышесказанного дает вам:
find foo/ -type f | perl -wple 'printf "%12u ", (stat)[9]' | \
sort -r | cut -c14- | perl -wnle 'print if $. > 500' | \
perl -wnle 'unlink() or warn "$_: unlink failed: $!\n"'
rm -f
хотя.Вот как я бы сделал это в Python 3., который также должен работать для других ОС. После тестирования убедитесь, что раскомментируйте строку, которая фактически удаляет файлы.
источник
Я не знаю насчет «500 новейших», но с помощью find вы можете удалить вещи, которые старше X минут / дней. Пример для файла и старше 2 дней:
Сначала проверьте с:
Следите за обратным слешем и пробелом перед "\;". См. Страницу поиска для получения дополнительной информации.
источник
если бы вы могли хранить файлы х дней / часов вместо новейшего х числа, вы могли бы сделать это просто с
tmpwatch --ctime 7d
источник
Я думаю, что
-mtime
и-newer
параметрыfind
команды полезны для вас. Вы можете увидетьman find
для получения дополнительной информации.источник
почему бы не использовать этот более простой код:
источник