Видаліть файли, старіші за певний файл


14

Мені потрібно видалити з папки всі файли, старші за певний файл.
Запуск bash на CentOS 7.

У мене є рішення для цього, але я думаю, що повинен бути більш елегантний спосіб зробити це:

reference_file=/my/reference/file

get_modify_time()
{
    stat $1 | grep -Po "Modify: \K[0-9- :]*"
}

pit=$(get_modify_time $reference_file)
for f in /folder/0000* ; do [[ "$pit" > "$(get_modify_time $f)" ]] && rm $f ; done

Відповіді:


28

Я не пробував цього, але findмав би бути в змозі справити всю операцію просто:

$ find dir/ -type f ! -newer reference -delete

... або ...

$ find dir/ -type f ! -newer reference ! -name reference -delete

В основному:

  • ! -newer referenceвідповідає файлам, які були нещодавно змінені reference.
  • -delete видаляє їх.
  • ! -name referenceвиключає reference, якщо він також знаходиться під dir/і ви хочете його зберегти.

Це має видалити всі файли, старші referenceта розташовані під dir/.


2
Ідеально :). Щойно додано, -maxdepth 1щоб пошук не був рекурсивним
csny

3
! -newerозначає "не новіший", тому "старший або такий самий вік "; сам файл буде збігатися, якщо він на шляху findдивиться, просто щось, про що слід пам’ятати.
ferada

1
@ferada Це не стане, якщо ви виключаєте це, тому мій відповідь також включає ! -name reference(див. третю групу).
Джон У. Сміт

7

порівняти час модифікації файлу з testвикористанням -nt(новіше) і -ot(старше) операторів:

if [ "$file1" -ot "$file2" ]; then
    #do whatever you want;
fi

2
Дякую, це краще, ніж моє рішення, але вам все одно потрібно повторити всі файли в папці та порівняти ... Інша відповідь ще більш елегантна
csny
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.