Відповіді:
Якщо я правильно вас зрозумів, це ви хочете зробити:
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виявляє виникнення. Однак, якщо ви заміните на ;a +, grepвиклик виводиться з findоб'єднаного (до певної межі). Дивіться питання Використання крапки з комою (;) проти плюс (+) з exec, щоб знайти більше по темі.
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 -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).