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

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

Я нахожусь на ubuntu OS. Я хочу, чтобы grep слово (например, XYZ) внутри всех файлов журнала, которые создаются в диапазоне дат 28 мая 2012 года до 30 мая 2012 года.

Как это сделать?

4b9b3361

Ответ 1

Это немного отличается от решения 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 будет возвращать только те файлы, которые оба (a) с именем foo и (b) больше 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

Ответ 2

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

find -newermt "28 May 2012" -not -newermt "30 May 2012" -exec grep XYZ \{\} \;

Ответ 3

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

find . -type f -ctime -9 -ctime +6 -print0 | xargs -0 grep XYZ