Подтвердить что ты не робот

UNIX find: напротив опции -newer существует?

Я знаю, что есть эта опция для команды поиска unix:

find -version
GNU find version 4.1

    -newer file Compares the modification date of the found file with that of
        the file given. This matches if someone has modified the found
        file more recently than file.

Есть ли опция, которая позволит мне найти файлы, которые старше определенного файла. Я хотел бы удалить все файлы из каталога для очистки. Таким образом, альтернатива, в которой я найду все файлы старше N дней, тоже будет выполнять эту работу.

4b9b3361

Ответ 1

Вы можете использовать !, чтобы скрыть операцию -newer следующим образом:

find . \! -newer filename

Если вы хотите найти файлы, которые были в последний раз модифицированы более 7 дней назад, используйте:

find . -mtime +7

UPDATE:

Чтобы избежать совпадения в файле, который вы сравниваете, используйте следующее:

find . \! -newer filename \! -samefile filename

Ответ 2

Вы можете просто использовать отрицание:

find ... \! -newer <reference>

Вы также можете попробовать семейство опций -mtime/-atime/-ctime/-Btime. Я не помню, как они работают, но они могут быть полезны в этой ситуации.

Остерегайтесь удаления файлов из find, особенно с правами root; существует целая куча способов, которые непривилегированный, вредоносный процесс в одной и той же системе может обмануть его в удалении вещей, которые вы не хотите удалять. Я настоятельно рекомендую вам прочитать весь раздел Deleting Files " GNU find руководство.

Ответ 3

Если вам нужны только файлы, которые старше файла "foo", а не самого foo, исключите файл по имени, используя отрицание:

find . ! -newer foo ! -name foo

Ответ 4

Обратите внимание, что отрицание нового означает "старая или та же временная метка":

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

[email protected]:/home/thomas/tmp/ touch test
[email protected]:/home/thomas/tmp/ find ./ ! -newer test
./test

Ответ 5

К сожалению, find не поддерживает это ! -Newer не означает старше. Это означает, что оно не новее, но оно также соответствует файлам, которые имеют одинаковое время модификации. Поэтому я предпочитаю использовать

for f in path/files/etc/*; do
    [ $f -ot reference_file ] &&  {
        echo "$f is older" 
        # do something
    }
done