Risposte:
Se ti capisco correttamente, questo è quello che vuoi fare:
find . -name '*.py' -print0 | xargs -0 grep 'something' > output.txt
Findtutti i file con estensione py, grepsolo le righe che contengono somethinge salvano le righe output.txt. Se il file contiene qualcosa, verrà sostituito.
Modifica: utilizzando -exec:
find . -name '*.py' -exec grep 'something' {} \; > output.txt
Sto incorporando il commento di Chris Downs qui. Il comando sopra riportato verrà grepeseguito tutte le volte che findtrova occorrenze. Tuttavia, se si sostituisce ;con a +, grepviene chiamato con l'output da findconcatenato (fino a un certo limite). Vedi domanda Uso del punto e virgola (;) vs plus (+) con exec in find per ulteriori informazioni sull'argomento.
grep -Hse si desidera includere il nome file del file nell'output.
Se si desidera salvare tutte le righe corrispondenti in tutti i file output.txt, l'ultimo comando funziona, tranne per il fatto che ;alla fine del comando manca il necessario .
find . -name "*.py" -type f -exec grep "something" {} \; > output.txt
Se si desidera che ogni esecuzione di grepproduca l'output in un file diverso, eseguire una shell per calcolare il nome del file di output ed eseguire il reindirizzamento.
find . -name "*.py" -type f -exec sh -c 'grep "something" <"$0" >"$0.txt"' {} \;
find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt E se vuoi vedere i numeri di riga delle linee grep che puoi, ovviamente, usaregrep -n "something"
Utilizzare tee:
find . -name '*.py' | tee output.txt | xargs grep 'something'
L'avvertimento, è se si dispone di tutti i file con caratteri speciali (spazi inclusi), che xargse grepnon funziona bene con ( a file.txtsarà interpretato come due file, ae file.txt). L'alternativa a quella è usare il -xo -print0, ma uno di questi inquinerà il tuo output.txt. Lo -xuseranno \per sfuggire a determinati personaggi speciali e questo sarà dentro output.txt. Il -print0utilizzerà un byte null come separatore di campo (che richiede anche xargs -0) e output.txtsarà simile a una lunga linea contigua di testo.
Il modo in cui gestisci (o no) questo dipende da te.
+invece di\;, migliorerà significativamente i tempi di esecuzione (poiché contatterà gli argomenti prima dell'esecuzione fino alARG_MAX).