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


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.