“Grep -r foo *” vs “grep -r foo.”


10

Quando usi grep -r puoi cercare in tutti i file con * o. e sembra restituire la stessa cosa ma è davvero la stessa?

Diciamo che cerco "pippo", quindi potrei scrivere

grep -r foo *

o

grep -r foo .

Qualcuno cercherebbe di spiegare la differenza tra. e *?

Risposte:


15

grep -r foo *non cerca corrispondenze in file o directory nascosti, inoltre *viene espanso dalla shell, quindi potresti ritrovarti con un errore troppo lungo nella lista degli Argomenti quando ci sono molte voci nella directory corrente, o altri errori o comportamenti scorretti se il il nome di alcuni file o directory inizia con un trattino.

L'invocazione grep -r foo .non ha i suddetti difetti

aggiornato:

Un'altra differenza: la pagina man di grep (@ fedora17) dice:

-r, --recursive
    Read all files under each directory, recursively, following symbolic links only if they
    are on  the  command  line.  ...

Ci sarà anche una differenza quando si esegue questo comando in una directory vuota:

$ grep -r foo *; echo $?
grep: *: No such file or directory
2
$ grep -r foo .; echo $?
1
$

4

Se usi l'asterisco, non puoi abbinare i file nelle directory il cui nome inizia con un punto, come .cache.

Aggiornare:

Questo perché il file *viene espanso dalla shell prima di chiamare grep, quindi riceve un elenco di nomi anziché un singolo nome di directory (per l'attuale .). Il modo in cui la shell espande il modello può essere personalizzato con il parametro shell (come per nullglob, nocaseglobo altre bashopzioni) o essere variabili d'ambiente (come LANGo LC_ALL)

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.