UNIX find: противоположность-более новая опция существует?

UNIX find: противоположность-более новая опция существует?

30.06.2011 07:02:53 Просмотров 29 Источник

Я знаю, что есть такая опция для команды find в 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 дней, тоже сделала бы эту работу.

У вопроса есть решение - Посмотреть?

Ответы - UNIX find: противоположность-более новая опция существует? / UNIX find: opposite of -newer option exists?

Является ответом!
qbert220

30.06.2011 07:07:11

Вы можете использовать a !чтобы отрицать более новую операцию, подобную этой:

find . \! -newer filename

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

find . -mtime +7

ОБНОВЛЕНИЕ:

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

find . \! -newer filename \! -samefile filename
https://stackoverflow.com/questions/6536837/unix-find-opposite-of-newer-option-exists/6536905#comment30364380_6536905
Важно отметить, что эта логика будет "равна или старше". Таким образом, он будет включать файл ссылки, если он находится в пути. Смотрите, ответ Марти ниже для лучшего решения.
https://stackoverflow.com/questions/6536837/unix-find-opposite-of-newer-option-exists/6536905#comment30420077_6536905
Ответ Марти также предотвратит совпадение файлов с тем же именем, что и тестовый файл. Я обновил свой ответ тестом, исключающим файл, с которым проводится проверка.
https://stackoverflow.com/questions/6536837/unix-find-opposite-of-newer-option-exists/6536905#comment93638735_6536905
Вы также можете использовать -notвместо \!.
https://stackoverflow.com/questions/6536837/unix-find-opposite-of-newer-option-exists/6536905#comment106312817_6536905
Этот (обновленный) ответ неверен. Например, touch -t $(date +%Y%m%d0000.00) fence foo bar; find . ! -newer fence ! -samefile fenceполучает fooи bar.
zwol

30.06.2011 07:08:56

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

find ... \! -newer <reference>

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

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

Thomas Aregger

10.04.2012 07:00:15

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

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

thomas@vm1112:/home/thomas/tmp/ touch test
thomas@vm1112:/home/thomas/tmp/ find ./ ! -newer test
./test
Marty

25.01.2013 05:14:15

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

find . ! -newer foo ! -name foo
user2021201

09.03.2015 05:16:02

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

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

07.02.2020 12:07:01

find dir \! -newer fencefile -exec \
  sh -c '
    for f in "$@"; do
      [ "$f" -ot fencefile ] && printf "%s\n" "$f"
    done
  ' sh {} + \
;
https://stackoverflow.com/questions/6536837/unix-find-opposite-of-newer-option-exists/60110264#comment106314236_60110264
Хотя код может решить проблему, хороший ответ должен объяснить, что код делает и как он помогает.
Закрыть X