3

Я хочу найти (и удалить) все файлы из каталога, которые были в каталоге более X дней. Я знаю, что могу найти файлы, которые не были изменены в течение часа, с помощью find /directory/* -mmin 3600 , но когда я копирую старый файл в Windows в свой каталог на сервере Debian, он сохраняет свой возраст, и я могу не скажи, как долго он там был.

2 ответа2

0

Есть сценарий оболочки.

#!/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 эквивалентной.

-1

Это должно работать, например, 10 часов назад:

X=10; find /directory/ -type f -atime $X -exec echo rm -fv {} ';'

-atime "последний доступ * 24 часа назад", удалите "echo", если он делает то, что вы хотите.

также для файлов, которые последний раз модифицировались час назад, это проще:

find . -mtime 1

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .