Я использую следующее, чтобы найти все файлы, которые старше эталонного файла...

find /home/testuser -name "dummyfiles*" ! -newer referencefile.txt

... который работает, как ожидалось.

Однако я хочу добавить немного снисходительности ко времени, чтобы он находил только те файлы, которые старше эталонного файла — несколько часов.

Например, если у меня есть эталонный файл с датой модификации May 26 11:26, я хочу найти файлы старше May 26 9:26 (т. е. с 2-часовой снисходительностью к эталонному файлу).

В этом примере правильными совпадениями будут следующие...

May 26 7:00
Apr 15 14:00

... и следующее не должно совпадать...

Jun 13 9:00
May 26 10:00

В конечном счете, я хочу удалить все файлы, которые я найду, так что было бы здорово, если бы find смог справиться с этим требованием? В противном случае, есть ли какие-либо другие альтернативы, которые позволят мне удалить эти файлы, не слишком запутываясь?

2
Stéphane Chazelas 10 Янв 2022 в 17:24
Пожалуйста, не могли бы вы уточнить, ищете ли вы 1) файлы старше эталонного файла на 2 часа ИЛИ более 2 часов (>=) 2) файлы старше эталонного файла ровно на 2 часа. знак равно
 – 
lese
6 Ноя 2015 в 11:52
Я ищу файлы, которые старше эталонного файла менее чем на 2 часа. См. пример в моем вопросе - в примере я бы хотел, чтобы все файлы были старше May 26 9:26, поэтому он также должен соответствовать файлам с датами May 26 7:00, Apr 15 14:50,... но не совпадают даты Jun 13 9:00 или May 26 10:00.
 – 
wattostudios
9 Ноя 2015 в 05:30

2 ответа

Попробуйте с этим:

find /home/testuser -name "dummyfiles*" ! -newer referencefile.txt -mmin +120 -print

Добавление параметра -mmin +120 команда find вернет только файлы старше 2 часов по сравнению с датой модификации referencefile.txt.

Контрольная работа:

mkdir find
touch find/dummyfiles1 find/dummyfiles2 find/dummyfiles3 find/dummyfiles4 find/referencefile.txt
touch -t 8001031305 dummyfiles1 dummyfiles2
find find/ -name "dummyfiles*" ! -newer find/referencefile.txt -mmin +120

Выход:

найти/dummyfiles1

найти/dummyfiles2

-2
lese 29 Окт 2015 в 12:04
1
Вы должны объяснить, почему ваше решение отличается от того, что уже делает OP, и как оно решает их проблему.
 – 
cas
29 Окт 2015 в 09:33
Улучшил ответ, в моей стране было так поздно :)
 – 
lese
29 Окт 2015 в 11:53
3
Нет, это не делает то, что вы утверждаете. Эта команда ищет файлы старше referencefile.txt и старше двух часов. Ничто здесь не говорит «на два часа старше эталонного файла».
 – 
Gilles 'SO- stop being evil'
1 Ноя 2015 в 02:00
Этот ответ точно соответствует тому, что я утверждаю (не называйте меня рассказчиком): «вернуть только файлы старше 2 часов» (это то, что я утверждаю). В любом случае, возможно, я не понял вопроса. Ждем разъяснений от ОП.
 – 
lese
6 Ноя 2015 в 11:54

В системе GNU вы можете сделать что-то вроде:

TZ=UTC0 find /home/testuser -name "dummyfiles*" ! -newermt "$(
  TZ=XXX2:00:00 date -r referencefile.txt +%FT%T.%N)"

То есть заставить date распечатать изменение файла в часовом поясе, отстающем на 2 часа от UTC (поэтому, если последний раз файл был изменен в 15:00 UTC, date напечатает 13:00) и заставить find интерпретировать эту отметку времени как время UTC (поэтому в нашем примере мы попытаемся найти файлы, последний раз измененные до 13:00 UTC).

Это ограничено смещением до 24 часов (или 48 часов, если вы используете TZ=XXX-24 для find). Для произвольных смещений вы можете сделать:

(
export TZ=UTC0
find /home/testuser -name "dummyfiles*" ! -newermt "$(
  date -d "$(date -r referencefile.txt +%FT%T.%N) - 2 hours" +%FT%T.%N)"
)

Или вы можете использовать perl:

perl -MFile::Find -le '
  $min_age = (-M "referencefile.txt") + 2/24;
  find (sub {
    print $File::Find::name if $_ =~ /^dummyfiles/ && (-M$_) > $min_age
    }, @ARGV)
  ' -- /home/testuser

Обратите внимание, что в отличие от find (но подобно GNU date -r), для символических ссылок perl -M учитывает возраст файла, на который он ссылается, а не возраст символической ссылки. сам. Младшая часть временной метки также не учитывается.

1
Stéphane Chazelas 10 Янв 2022 в 15:42