grep --exclude n'exclut pas mon fichier

8

Je recherche dans un répertoire une chaîne particulière (pour voir toutes les instances où la chaîne est présente et dans quels fichiers). Cependant, je souhaite exclure un fichier particulier de la recherche.

Voici ce qui se passe-

$echo "searchstring" > ./old_folder/useless_file
$echo "searchstring" > ./new_folder/good_file
$grep -r --exclude="old_folder/useless_file" searchstring *
./old_folder/useless_file:searchstring
./new_folder/good_file:searchstring

Voici la sortie que je veux-

./new_folder/good_file:searchstring
sbhatla
la source
6
Si vous changez --exclude="old_folder/useless_file"simplement --exclude=useless_filepour obtenir le même problème? (Ma lecture de la page de manuel suggère que le modèle --excludene devrait être que le nom de base, sans le chemin d'accès.)
Wildcard

Réponses:

11

L' --excludeoption prend des globes qui sont comparés aux noms de fichiers, pas aux répertoires ou aux chemins d'accès complets:

  --exclude=GLOB
          Skip   files  whose  base  name  matches  GLOB  (using  wildcard
          matching).  A file-name  glob  can  use  *,  ?,  and  [...]   as
          wildcards,  and  \  to  quote  a wildcard or backslash character
          literally.

Donc, vous pourriez faire:

$ grep -r --exclude="*useless_file*" searchstring 
new_folder/good_file:searchstring

Ou, pour exclure tous les fichiers de ce répertoire:

$ grep -r --exclude-dir="old_folder" searchstring 
new_folder/good_file:searchstring
terdon
la source