Я хочу найти (и удалить) все файлы из каталога, которые были в каталоге более X дней. Я знаю, что могу найти файлы, которые не были изменены в течение часа, с помощью find /directory/* -mmin 3600 , но когда я копирую старый файл в Windows в свой каталог на сервере Debian, он сохраняет свой возраст, и я могу не скажи, как долго он там был.
2 ответа
Есть сценарий оболочки.
#!/bin/sh
inotifywait --monitor --format="%e %f" --event=create,moved_from,moved_to,delete $directory |
while read event file
do
case "$event" in
# asterisks needed because directory events end in ",ISDIR"
(CREATE*)
echo "$(date +%s) $file" >>"$index"
;;
(MOVED_TO*)
# moved_to includes overwrites, so we have to grep out the file, to make sure it wasn't already there
# use `sponge` to enable safe reading and writing of the index in the same pipeline
grep -Fv " $file" "$index" | sponge "$index"
echo "$(date +%s) $file" >>"$index"
;;
(MOVED_FROM*|DELETE*)
grep -Fv " $file" "$index" | sponge "$index"
;;
esac
done
Доступ к файлам и их модификации игнорируются и не изменяют индекс; однако, если вы переименуете файл, его временная метка будет обновлена.
Там никогда не нужно sort индекс; мы только добавляем новые файлы в конец индекса и удаляем их из середины.
inotifywait , как вызывается в сценарии, прослушивает файловые события и выводит тип события, пробел, имя файла или каталога, вызвавшего событие, и символ новой строки. Вы можете заменить его эквивалентной программой.
sponge просто читает весь ввод из stdin во внутренний буфер, а затем записывает его в файл. Вы можете заменить его эквивалентным или, альтернативно, записать вывод в ${index}.new а затем в mv -f "${index}.new" "$index" .
date +%s выводит текущую дату и время в виде количества секунд из эпохи. Этот вызов работает как с GNU, так и с date BSD. Вы можете изменить формат (например, date '+%F %T') для удобочитаемого индекса или заменить date эквивалентной.
Это должно работать, например, 10 часов назад:
X=10; find /directory/ -type f -atime $X -exec echo rm -fv {} ';'
-atime "последний доступ * 24 часа назад", удалите "echo", если он делает то, что вы хотите.
также для файлов, которые последний раз модифицировались час назад, это проще:
find . -mtime 1
