Risposte:
Se ti capisco correttamente, questo è quello che vuoi fare:
find . -name '*.py' -print0 | xargs -0 grep 'something' > output.txt
Find
tutti i file con estensione py
, grep
solo le righe che contengono something
e 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à grep
eseguito tutte le volte che find
trova occorrenze. Tuttavia, se si sostituisce ;
con a +
, grep
viene chiamato con l'output da find
concatenato (fino a un certo limite). Vedi domanda Uso del punto e virgola (;) vs plus (+) con exec in find per ulteriori informazioni sull'argomento.
grep -H
se 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 grep
produca 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 xargs
e grep
non funziona bene con ( a file.txt
sarà interpretato come due file, a
e file.txt
). L'alternativa a quella è usare il -x
o -print0
, ma uno di questi inquinerà il tuo output.txt
. Lo -x
useranno \
per sfuggire a determinati personaggi speciali e questo sarà dentro output.txt
. Il -print0
utilizzerà un byte null come separatore di campo (che richiede anche xargs -0
) e output.txt
sarà 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
).