Ответы:
Если я вас правильно понимаю, это то, что вы хотите сделать:
find . -name '*.py' -print0 | xargs -0 grep 'something' > output.txt
Find
все файлы с расширением py
, grep
только строки, содержащие something
и сохраняющие строки в output.txt
. Если файл содержит что-либо, он будет заменен.
Редактировать: Используя -exec:
find . -name '*.py' -exec grep 'something' {} \; > output.txt
Я включил комментарий Криса Даунса здесь. Приведенная выше команда будет grep
выполняться столько раз, сколько будет find
найдено. Тем не менее, если вы замените ;
с +
, grep
вызываются с выходом из find
конкатенации (до определенного предела). Смотрите вопрос Использование точки с запятой (;) против плюс (+) с exec в find для получения дополнительной информации по этому вопросу.
grep -H
если вы хотите включить имя файла в вывод.
Если вы хотите сохранить все совпадающие строки во всех файлах output.txt
, ваша последняя команда работает, за исключением того, что вы пропустили обязательное ;
в конце команды.
find . -name "*.py" -type f -exec grep "something" {} \; > output.txt
Если вы хотите, чтобы при каждом запуске grep
выводился отдельный файл, запустите оболочку, чтобы вычислить имя выходного файла и выполнить перенаправление.
find . -name "*.py" -type f -exec sh -c 'grep "something" <"$0" >"$0.txt"' {} \;
find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt
И если вы хотите увидеть номера строк grep'-строк, вы можете, конечно, использоватьgrep -n "something"
Используйте tee
:
find . -name '*.py' | tee output.txt | xargs grep 'something'
Протест, если у вас есть какие - либо файлы с помощью специальных символов (включая пробелы) , что xargs
и grep
не будет хорошо работать ( a file.txt
будет интерпретироваться как два файла, a
а file.txt
). Альтернативой этому является использование либо, -x
либо -print0
, но любой из них будет загрязнять ваш output.txt
. -x
Будет использовать , \
чтобы избежать некоторых специальных символов , и это будет output.txt
. В -print0
качестве разделителя полей будет использоваться нулевой байт (который также требуется xargs -0
) и output.txt
будет выглядеть как одна длинная непрерывная строка текста.
Как вы справляетесь (или не имеете) с этим, зависит только от вас.
+
вместо\;
, это значительно улучшит время выполнения (поскольку оно будет содержать аргументы до выполнения и доARG_MAX
).