Я нахожусь на ubuntu OS. Я хочу, чтобы grep слово (например, XYZ) внутри всех файлов журнала, которые создаются в диапазоне дат 28 мая 2012 года до 30 мая 2012 года.
Как это сделать?
Я нахожусь на ubuntu OS. Я хочу, чтобы grep слово (например, XYZ) внутри всех файлов журнала, которые создаются в диапазоне дат 28 мая 2012 года до 30 мая 2012 года.
Как это сделать?
Это немного отличается от решения 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
Объединить grep с find:
find -newermt "28 May 2012" -not -newermt "30 May 2012" -exec grep XYZ \{\} \;
find
, похоже, не имеет параметров, где вы можете указать конкретные даты для сопоставления времени (по крайней мере, у версии на моем ноутбуке нет - могут быть другие версии и/или другие инструменты, которые выполняют аналогично), поэтому вам придется использовать количество дней. Итак, по состоянию на 2012/06/05 вы хотите найти файлы более 9 дней, но старше 6 дней:
find . -type f -ctime -9 -ctime +6 -print0 | xargs -0 grep XYZ