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

26

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

user1058398
источник
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значение к полуночи.
Ройма