Я ищу файлы в моем домашнем каталоге, которые были изменены за последние две минуты, которые также содержат определенную строку. Я попробовал с помощью этой команды:
find -type d -mmin -2 -ls | grep -Ril "mystring"
Кажется, это работает, но, по-видимому, он печатает только те файлы, которые содержат заданную строку внутри, а не файлы, которые были изменены 2 минуты назад и содержали эту строку. Похоже, что первая часть команды не выполняется.
решение1
У вас была хорошая попытка с вашим собственным предложением.
find -type d -mmin -2 -ls | grep -Ril "mystring"
Это определило бы каталоги ( -type d
), которые были изменены в течение последних двух минут, а не файлы ( -type f
). Передача вывода -ls
в grep
обычно выполняла бы поиск сгенерированных имен файлов для mystring
. Однако в этом случае флаг -R
изменяет поведение grep
, и он игнорирует ваш список имен файлов, вместо этого выполняя поиск по каждому файлу в текущем каталоге и ниже.
Итак, давайте разделим проблему на две части.
Поиск файлов, которые были изменены за последние 2 минуты в вашем домашнем каталоге.
find ~ -type f -mmin -2
[Файлы], которые содержат определенную строку
grep -Fl 'certain String' {files...}
Теперь вам нужно собрать их вместе. Это {}
заполнитель для имен файлов, сгенерированных с помощью find
шага 1, а завершающий символ +
указывает, что {}
может повторятьсямного раз, т.е. несколько имен файлов
find ~ -type f -mmin -2 -exec grep -Fl 'certain String' {} +
Изменение grep
на echo grep
покажет вам, что именно выполняется командой find
; это может быть полезным методом отладки:
find ~ -type f -mmin -2 -exec echo grep -Fl 'certain String' {} +
Пожалуйста, рассмотрите возможность выполнения man find
и man grep
узнайте, какие существуют различные варианты, такие как -F
и -l
в grep -Fl
, так как в противном случае вы не научитесь ничему из заданного вам упражнения; вы просто будете копировать ответ.
решение2
В zsh
оболочке:
grep -l -F -i 'string' ~/**/*(.Dmm-2)
... где **
рекурсивно соответствует подкаталогам, и где .D
in (.Dmm-2)
означает «соответствует только обычным файлам ( .
), но включает скрытые файлы ( D
)», а где mm-2
означает «измененные в течение последних двух минут».