Как искать определенную строку в файлах с определенной датой?

La causa raíz también podría ser permisos de archivo insuficientes. Encontré el problema al intentar pegar texto en vi desde Windows y ninguna de las sugerencias anteriores funcionó. Solo después de darme permiso de escritura en el archivo, el texto podría pegarse con un simple clic derecho del mouse en el modo INSERTAR de vi.

1
27.02.2019, 20:59
4 ответа

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

touch -t 201902210000 /tmp/start-time
touch -t 201902212359.59 /tmp/end-time

... а затем запросить findфайлы, которые новее начального -времени, но не новее конечного -времени:

find. -type f  -newer /tmp/start-time  ! -newer /tmp/end-time

Собираем все воедино:

touch -t 201902210000 /tmp/start-time
touch -t 201902212359.59 /tmp/end-time
find. -type f -newer /tmp/start-time  ! -newer /tmp/end-time -name '*.xml' -exec grep JMS111 /dev/null {} +
rm /tmp/start-time /tmp/end-time

Это будет искать файлы в правильном временном интервале с именами, заканчивающимися на .xml, а затем передать эти имена файлов в grep, помещая столько, сколько может за проход. Я добавил /dev/nullв качестве «файла» для поиска grep вместе с именами файлов из find, если они есть. Таким образом, если есть только один совпадающий файл, grep«принуждается» сообщать о совпадающем имени файла (, поскольку /dev/null никогда не совпадет, об этом не будет сообщено ).

На выходе будут имена файлов и соответствующие строки из этих файлов.

3
28.04.2021, 23:36

Вы можете использовать

find. -name 'a[123]' -ctime 6 | xargs grep -l 'JMS111'

-ctime 6ищет файлы старше 6 дней. Он фактически сравнивает дату создания файла с 24-часовым периодом между 6 *24 часами и 7 *24 часами до запуска команды. Если дата создания находится в этом периоде, а имя файла — «a1», «a2» или «a3», то findпечатает путь к этому файлу. Поскольку период, указанный параметром -ctime , основан на том, когда вы запускали команду find, вам придется использовать другое значение для , если вы запустите find завтра, чем если бы вы запустили его сегодня.

Примечание. :Если вы используете -ctime -6, find напечатает имена файлов, которым 6 дней или меньше, -ctime +6напечатает имена файлов, которым 6 дней или больше. Кроме того, некоторые версии find позволяют указать единицы измерения, например, 6h для 6-часовой давности.

Вместо этого вы можете использовать -mtime, если хотите искать по времени модификации, а не по времени создания.

Использование xargsпозволяет легко проверить, получаете ли вы правильный список файлов из find перед выполнением grep. Также,если вы поместите grep в первичный -exec, find вызывает его один раз для каждого найденного файла, тогда как xargsполучает список файлов, которые он передает одному вызову grep, что менее ресурсоемко.

Одним из недостатков -ctimeявляется то, что вам нужно подсчитать количество дней с момента создания файла, но вы можете вычислить это, запустив

find. -ctime n | xargs ls -l

пока не появятся файлы с интересующей вас датой.

... И вам не нужно помнить об удалении файлов брекетинга, как вы делаете с -newer.

1
28.04.2021, 23:36

Это сработает:

$ grep -e JMS111 *20190221*.txt
-1
28.04.2021, 23:36

См. скриншот ниже,

enter image description here

Нам нужно указать файл, содержащий определенную строку и созданный в определенную дату. Для этого мы можем выполнить следующую команду:

  • sudo найти. -type f -newermt 2020 -10 -06 -exec grep -l "test" {} \;

Приведенная выше команда выведет список файлов, созданных 6 октября и содержащих строку «тест». Обратитесь к скриншоту ниже,

enter image description here

На первом скриншоте видно 3 файла. Два из них (test.scala и text2.txt )содержат строку 'test', но отличаются датой создания. А на втором снимке экрана видно, что мы перечислили файл, содержащий строку «тест», созданный 6 октября.

0
28.04.2021, 23:36

Теги

Похожие вопросы