«Grep -r foo *» vs «grep -r foo».

10

Lorsque vous utilisez grep -r, vous pouvez rechercher dans tous les fichiers avec * ou. et cela semble retourner la même chose mais est-ce vraiment la même chose?

Disons que je cherche "foo", alors je pourrais écrire

grep -r foo *

ou

grep -r foo .

Quelqu'un voudrait-il expliquer la différence entre les deux? et *?

Johan
la source

Réponses:

15

grep -r foo *ne recherche pas les correspondances dans les fichiers ou répertoires cachés, *est également développé par le shell afin que vous puissiez vous retrouver avec une erreur de liste d'arguments trop longue lorsqu'il y a beaucoup d'entrées dans le répertoire actuel, ou d'autres erreurs ou mauvaise conduite si le le nom de certains fichiers ou répertoires commence par un tiret.

L'invocation grep -r foo .n'a pas les défauts ci-dessus

Actualisé:

Autre différence: la page de manuel de grep (@ fedora17) dit:

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

Il y aura également une différence lorsque vous exécuterez cette commande dans un répertoire vide:

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

Si vous utilisez un astérisque, vous ne pouvez pas faire correspondre des fichiers dans des répertoires dont le nom commence par un point, comme .cache.

Mettre à jour:

C'est parce que le *est développé par le shell avant d'appeler grep, donc il reçoit une liste de noms au lieu d'un seul nom de répertoire (pour le courant .). La façon dont shell développe le modèle peut être personnalisée avec un paramètre shell (comme pour nullglob, nocaseglobou d'autres bashoptions) ou être des variables d'environnement (comme LANGou LC_ALL)

eppesuig
la source