Ho un programma chiamato foo
che voglio eseguire su ogni risultato trovato tramite trova. Quindi qualcosa del genere:
find . -name '*.o' -type f -exec foo {} ;
Voglio grep l'output di tutte queste invocazioni di foo
per una certa barra di stringa. Quindi aggiungo questo:
find . -name '*.o' -type f -exec foo {} ; | grep bar
Ma perdo le informazioni originali sui file da cui provengono le corrispondenze. Ho provato ad aggiungere -fprintf /dev/stderr '%pn'
al find
command ma ora sembra che stdout sia sparito, perché non vengono stampati risultati di grep.
Come posso ottenere ogni nome di file stampato sull'output e POI avere i risultati di grep corrispondenti a quel file stampato dopo?
In alternativa, se ci fosse un modo per creare -H
argomento di grep
funziona anche quello andrebbe bene, ma come scritto non funzionerà perché sto solo passando il testo da stdin e grep
non conosce il nome del file. Ho provato vari incantesimi di xargs
, ma non riuscivo nemmeno a far funzionare nulla di tutto ciò.
Risposta accettata:
Per ottenere ogni nome di file stampato sull'output e POI avere i risultati grep corrispondenti a quel file stampato dopo, puoi avvolgere il -exec foo {} | grep
pipa in un guscio:
find . -name '*.o' -type f -print -exec sh -c 'foo "$1" | grep "bar"' sh {} ;
Per fare il -H
argomento di grep funziona con l'input standard, se la tua versione di grep
supporta il --label=
opzione che potresti fare
find . -name '*.o' -type f -exec sh -c '
foo "$1" | grep -H --label="$1" "bar"
' sh {} ;
o (se la tua ricerca supporta il +
alternativa a più argomenti a ;
):
find . -name '*.o' -type f -exec sh -c '
for f; do foo "$f" | grep -H --label="$f" "bar"; done
' sh {} +