Come posso fare in modo che grep non stampi errori "Nessun file o directory del genere"?


216

Sto esaminando una grande pila di codice gestita da git e ogni volta che eseguo 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 in cui posso far sparire quelle linee?


1
In questi giorni consiglierei di usare ag, acko cgrepinvece - sono molto più veloci / migliori di quelli grepper la ricerca di repository di codice.
lunixbochs

Se stai sfogliando il codice e stai cercando di evitare directory particolari, forse dovresti guardare ack. È un grep consapevole del codice sorgente e come tale ignorerà attivamente tali directory VCS (così come i backup vi ed emacs, i file non di origine ecc.).
Brian Agnew,

2
Come può un utente ricevere No such file or directorymessaggi per file e / o directory esistenti? O, al contrario, come si possono grep *ottenere nomi di file che non esistono? Si tratta di una condizione di competizione, in cui alcuni altri processi manipolano l'albero delle directory (creando, rinominando ed eliminando i file) mentre grepè in esecuzione?
Scott,

Risposte:


300

È possibile utilizzare il flag -so --no-messagesper eliminare gli errori.

-s, --no-message sopprime i messaggi di errore

grep pattern * -s -R -n

14
@Alex @Dogbert Questo risponde alla domanda, ma '-s' può mascherare i problemi, ad esempio quando usi xargs con grep. Prova a creare 2 file in una directory, "aaa.txt" e "a b.txt", entrambi contenenti la stringa "testo". Il comando /bin/ls -1 | xargs grep 'some text'ti darà "nessun file o directory" perché suddivide "a b.txt" in 2 argomenti. Se elimini, non ti accorgerai di aver perso un file.
Kelvin,

@Kelvin lo fa, ad esempio se uso finde uso print0con Risolve xargs -0il problema? Grazie
Luka

1
@Luka Questo dovrebbe risolvere il problema. Non incontrerai problemi se usi sempre quelle opzioni NUL, ma se non lo fai, è quasi garantito (IMHO) che dimenticherai nel momento più inopportuno.
Kelvin,

funziona su Mac OS X dove altre opzioni (--quiet) non lo fanno
philshem il

59

Se stai passando in rassegna un repository git, ti consiglio di usarlo git grep. Non è necessario passare -Ro il percorso.

git grep pattern

Questo mostrerà tutte le partite dalla directory corrente in basso.


5
+1 per l'utile comando specifico di git.
Però

2
+1 Questo è il comando git che mi mancava - questo mi permette di richiedere una stringa dallo stato dell'albero in qualsiasi commit (aggiungendo il commit dopo "pattern").
Kelvin,

1
Con il plugin fuggitivo, Ggrepcerca anche a partire dalla cima della directory Git invece della directory corrente.
Ciro Santilli 10 冠状 病 六四 事件 法轮功

Questo sembra essere significativamente più veloce del grep standard. (Forse ignora i file binari, ecc.? Nessuna idea, ma utile.)
Daniel

10

Errori del genere vengono generalmente inviati al flusso "errore standard", che è possibile reindirizzare a un file o semplicemente scomparire nella maggior parte dei comandi:

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

Risponde alla domanda, ma può mascherare i problemi. Vedi il mio commento sotto la risposta di Dogbert.
Kelvin,

5

Ho visto che accadendo più volte, con collegamenti interrotti (collegamenti simbolici che indicano file che non esistono), grep prova a cercare il file di destinazione, che non esiste (da cui il messaggio di errore corretto e accurato).

Di solito non mi preoccupo mentre eseguo attività sysadmin sulla console, ma all'interno degli script cerco file di testo con "trova", quindi grep ognuno:

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

Invece di:

grep -nRHi -e "widehat" /etc

4

Di solito non lascio che grep faccia 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 {} \;

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


1
+1. È molto meglio che eliminare gli errori. Tuttavia, penso che hai dimenticato il -execprima del grep.
Kelvin,

1
Cosa significa questo? \( -name .svn -o -name .git \)
sbhatla,

Perché non usare i flag --exclude o --exlcude-dir di grep?
Choylton B. Higginbottom,

1
@sbhatla la parentesi crea un ordine di operazioni per il comando find. stackoverflow.com/questions/24338777/...
Choylton B. Higginbottom

4

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

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

2
per trovare dovresti aggiungere -print0find -print0 | xargs -0 grep 'text'
aliva il

1

Utilizzare -Iin grep.

Esempio: grep SEARCH_ME -Irs ~/logs.


1
-Isalta i file binari - è equivalente a --binary-files=without-match. Tuttavia non sopprime i messaggi "Nessun file o directory del genere".
mwfearnley,

0

Reindirizzo stderra stdoute quindi uso invert-match ( -v) di grep per escludere la stringa di avviso / errore che voglio nascondere:

grep -r <pattern> * 2>&1 | grep -v "No such file or directory"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.