"Grep -r foo *" frente a "grep -r foo".

10

Al usar grep -r, puede buscar en todos los archivos con * o. y parece devolver lo mismo, pero ¿es realmente lo mismo?

Digamos que busco "foo", entonces podría escribir

grep -r foo *

o

grep -r foo .

¿Alguien intentaría explicar la diferencia entre ellos? y *?

Johan
fuente

Respuestas:

15

grep -r foo *no busca coincidencias en archivos o directorios ocultos, también *se expande por el shell, por lo que puede terminar con un error de lista de argumentos demasiado largo cuando hay muchas entradas en el directorio actual, o algunos otros errores o mal comportamiento si el El nombre de algunos de los archivos o directorios comienza con un guión.

La invocación grep -r foo .no tiene los defectos anteriores

Actualizado:

Otra diferencia: la página de manual de grep (@ fedora17) dice:

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

También habrá una diferencia cuando ejecute este comando en un directorio vacío:

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

Si usa asterisco, no puede hacer coincidir archivos en directorios cuyo nombre comience con un punto, como .cache.

Actualizar:

Esto se debe a que el *shell lo expande antes de llamar grep, por lo que recibe una lista de nombres en lugar de un solo nombre de directorio (para el actual .). La cáscara manera expandir el patrón puede ser personalizado con el parámetro shell (como para nullglob, nocaseglobu otras bashopciones) o ser variables de entorno (como LANGo LC_ALL)

eppesuig
fuente