Ответы:
Если я вас правильно понимаю, это то, что вы хотите сделать:
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).