Come posso fare in modo che grep non stampi errori “No such file or directory”?

Sto scavalcando una grande pila di codice gestita da git, e ogni volta che faccio un grep, vedo pile e pile di messaggi del modulo:

> grep pattern * -R -n whatever/.git/svn: No such file or directory 

C’è un modo per far sparire quelle linee?

Puoi usare il flag -s o --no-messages per sopprimere gli errori.

-s, –no-messages sopprime i messaggi di errore

 grep pattern * -s -R -n 

Se stai attraversando un repository git, ti consiglio di utilizzare git grep . Non è necessario passare in -R o nel percorso.

 git grep pattern 

Ciò mostrerà tutte le corrispondenze dalla tua directory corrente verso il basso.

Errori del genere vengono solitamente inviati al stream di “errore standard”, che è ansible redirect a un file o semplicemente scomparire nella maggior parte dei comandi:

 grep pattern * -R -n 2>/dev/null 

Di solito non faccio fare a grep la ricorsione stessa. Di solito ci sono alcune directory che vuoi saltare (.git, .svn …)

Puoi fare alias intelligenti con posizioni come quella:

 find . \( -name .svn -o -name .git \) -prune -o -type f -exec grep -Hn pattern {} \; 

Può sembrare eccessivo a prima vista, ma quando è necessario filtrare alcuni schemi è abbastanza utile.

Hai provato l’opzione -0 in xargs ? Qualcosa come questo:

 ls -r1 | xargs -0 grep 'some text' 

Ho visto accadere diverse volte, con collegamenti interrotti (collegamenti simbolici che puntano a file che non esistono), grep prova a cercare sul file di destinazione, che non esiste (da cui il messaggio di errore corretto e preciso).

Normalmente non mi preoccupo di fare attività di sysadmin sulla console, ma all’interno degli script cerco file di testo con “trova”, e poi grep ognuno:

 find /etc -type f -exec grep -nHi -e "widehat" {} \; 

Invece di:

 grep -nRHi -e "widehat" /etc 

Usa -I in grep.

Esempio: grep SEARCH_ME -Irs ~/logs .