GNU/Linux >> Linux Esercitazione >  >> Linux

La stampa del nome del file insieme ai risultati di Grep in Find -exec?

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 {} +

Linux
  1. Grep ricorsivo Vs Trova / -type F -exec Grep {}; Qual è più efficiente/più veloce?

  2. Du risultati sul filesystem incoerenti con Df?

  3. Ottenere l'opzione -exec in Trova per funzionare?

  4. Il nome del file non viene stampato correttamente con il carattere di sottolineatura _ in Bash

  5. Come trovare il file con name=php.ini su Linux usando il comando grep

Grep Command in Linux (Trova testo nei file)

Come trovare una stringa in un file su Linux

Trova i file persi con Scalpel

Trova testo nei file su Linux usando grep

Comando Grep in Linux (con esempi)

Abbina due stringhe in una riga con grep