Grep внутри всех файлов, созданных в пределах диапазона дат

Я на ОС Ubuntu. Я хочу найти слово (скажем, XYZ) во всех файлах журналов, созданных в диапазоне дат с 28 мая 2012 года по 30 мая 2012 года.

Как я могу это сделать?


person Vijayendra Bapte    schedule 05.06.2012    source источник
comment
Связанный с этим вопрос в Server Fault: serverfault.com/q/122824/36963   -  person brandizzi    schedule 05.06.2012


Ответы (3)


Это немного отличается от решения Banthar, но оно будет работать с версиями find, которые не поддерживают -newermt, и показывает, как использовать команду xargs, которая является очень полезным инструментом.

Вы можете использовать команду find для поиска файлов "определенного возраста". Это найдет все файлы, измененные между 5 и 10 днями назад:

 find /directory -type f -mtime -10 -mtime +5

Чтобы затем найти эти файлы для строки:

 find /directory -type f -mtime -10 -mtime +5 -print0 |
   xargs -0 grep -l expression

Вы также можете использовать переключатель -exec, но я нахожу xargs более читаемым (и он также часто работает лучше, но, возможно, не в этом случае).

(Обратите внимание, что флаг -0 позволяет этой команде работать с файлами со встроенными пробелами, такими как this is my filename.)

Обновление для вопроса в комментариях

Когда вы предоставляете несколько выражений для find, они объединяются по И. Например, если вы спросите:

find . -name foo -size +10k

...find будет возвращать только файлы, которые (а) имеют имя foo и (б) больше 10 Кбайт. Точно так же, если вы укажете:

find . -mtime -10 -mtime +5

...find будет возвращать только файлы, которые (а) старше 10 дней назад и (б) старше 5 дней назад.

Например, в моей системе сейчас:

$ date
Fri Aug 19 12:55:21 EDT 2016

У меня есть следующие файлы:

$ ls -l
total 0
-rw-rw-r--. 1 lars lars 0 Aug 15 00:00 file1
-rw-rw-r--. 1 lars lars 0 Aug 10 00:00 file2
-rw-rw-r--. 1 lars lars 0 Aug  5 00:00 file3

Если я запрашиваю «файлы, измененные более 5 дней назад (-mtime +5), я получаю:

$ find . -mtime +5
./file3
./file2

Но если я попрошу «файлы были изменены более 5 дней назад, но менее 10 дней назад» (-mtime +5 -mtime -10), я получаю:

$ find . -mtime +5 -mtime -10
./file2
person larsks    schedule 05.06.2012
comment
Может кто-нибудь объяснить, как указание -mtime дважды используется для указания диапазона? В частности, почему отрицательное число для первого случая и положительное число для второго? Либо я этого не понимаю, либо он не работает на Ubuntu 14.04.3 LTS. Это не обсуждается на странице руководства, которую я вижу. - person battey; 19.08.2016
comment
@battey, я обновил свой ответ ответом на ваш вопрос. - person larsks; 19.08.2016

Объедините grep с find:

find -newermt "28 May 2012" -not -newermt "30 May 2012" -exec grep XYZ \{\} \;
person Piotr Praszmo    schedule 05.06.2012
comment
Эта опция -newermt кажется недокументированной - она ​​не отображается ни в ссылке, ни на моих справочных страницах. Однако это прекрасно! Как вы это обнаружили? - person brandizzi; 05.06.2012
comment
@brandizzi Это меньше -newerXY. - person Piotr Praszmo; 05.06.2012

find, похоже, не имеет опций, в которых вы можете указать конкретные даты для сравнения временных меток (по крайней мере, версия на моем ноутбуке не имеет - могут быть другие версии и / или другие инструменты, которые работают аналогично), поэтому вам придется использовать количество дней. Итак, по состоянию на 05.06.2012 вы хотите найти файлы старше 9 дней, но старше 6 дней:

find . -type f -ctime -9 -ctime +6 -print0 | xargs -0 grep XYZ
person twalberg    schedule 05.06.2012
comment
Почему не -mtime (время модификации)? -ctime для времени состояния (что бы это ни было). - person Peter Mortensen; 30.07.2018