Я хочу найти (и удалить) все файлы из каталога, которые были в каталоге более 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