Видаліть усі файли, створені до певної дати


26

У мене є каталог, що містить велику кількість файлів (наприклад, журнали на кожен день року). Я хотів би видалити всі створені файли, перш ніж скажімо, 22/11. Як я можу цього досягти? Чи повинен я використовувати findпотім exec -rm? Я використовую ksh.


1
Зазвичай застереження полягає в тому, що файлові системи Unix, як правило, не містять записи про те, коли файл був створений - доступні лише ті часи, коли вклад та вміст востаннє змінені .
— Toby Speight

Відповіді:


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
Як що до цього ? Це працює ? знайти -тип f -mtime +5 -exec rm -f {} \;
— користувач1058398

1
@ user1058398 Відтепер файли, старіші за 5 днів, видалять.
— Валентин Байрамі

Чи видаляє папку разом із файлами? @ Val0x00ff
— Alper

1
@Avatar ні, тому що 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- не буде видалено
— калафат

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

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