Удалить все файлы, созданные до определенной даты


26

У меня есть каталог, содержащий большое количество файлов (например, журналы на каждый день года). Я хотел бы удалить все файлы, созданные до, скажем, 22/11. Как я могу этого достичь? Должен ли я использовать findтогда exec -rm? Я использую кш.


1
Обычное предостережение заключается в том, что файловые системы Unix, как правило, не содержат записи о том, когда файл был создан, - доступно только время последнего изменения индекса и содержимого .
— Тоби Спейт

Ответы:


35

Использование findпо-прежнему является предпочтительным способом удаления файлов. Смотрите http://mywiki.wooledge.org/UsingFind для получения дополнительной информации.

Один из способов сделать это - создать файл с отметкой времени. например

touch -t 201311220000 /tmp/timestamp

Теперь удалите файлы GNU find(предположим, в текущем каталоге), которые соответствуют отметке времени, например:

find . -type f ! -newer /tmp/timestamp -delete  

или не GNU найти

find . -type f ! -newer /tmp/timestamp -exec rm {} \;

2
Как насчет этого ? Это работает ? find -type f -mtime +5 -exec rm -f {} \;
— user1058398

1
@ user1058398 Это удалит файлы старше 5 дней.
— Валентин Байрами

Это также удаляет папку вместе с файлами? @ val0x00ff
— Alper

1
@ Аватар нет, потому что действие type -fограничено только файлами.
— Валентин Байрами

22

С GNU или некоторыми BSD find:

find . ! -newermt 2013-11-22 ! -type d -delete

Обратите внимание, что он проверяет время последнего изменения файлов. На некоторых BSD вы можете использовать -newerBtвместо, -newermtчтобы проверить время рождения inode файла, если доступно вместо этого.


1
find /path/to/directory/ -mtime +<number of days> -name '<file name>' -exec rm -rf {} \;

пример:

find /Netap_fileshare_backup/SQL/DB_backups/xeo/ -mtime +15 -name 'ORA_XEO*' -exec rm -rf {} \;

В этом случае он удалит все файлы, которые начинаются с "ORA_XEO" более 15 дней.


Хотя лучше смотреть это с помощью rm -rf, первая команда удалит все содержимое любых каталогов старше 15 дней. (Кроме того, почему круглые скобки -name?)
— ilkkachu

Вы правы, нам не нужно ставить "(" ")".
— Калафате

но если мы хотим добавить условие, оно может быть полезным. например, если мы хотим удалить все файлы, заканчивающиеся на «.jar» или «.cp», и начать с «ex». example.jar- это будет удалено example.cp- это будет удалено example.tar- это не будет удалено
— calafate

в этом случае мы можем использовать:find /path/to/directory/ -mtime +<number of days> \( -name '*.jar' -o -name '*.cp' \) -name 'ex*' -exec rm -rf {} \;
— Calafate

Это приведет к удалению некоторых файлов из <количества дней>, а не всех файлов старше <числа дней>, если вы не запустите его ровно в полночь, и он завершится в течение секунды. В GNU findвы должны использовать -daystartмодификатор, чтобы привести -mtimeзначение к полуночи.
— Ройма
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.