Je souhaite rechercher une chaîne de texte dans tous les fichiers d'un répertoire (et non dans ses sous-répertoires; je sais que l'option -r
le fait, mais ce n'est pas ce que je veux).
Fonctionnement
grep "string" /path/to/dir
est censé pouvoir faire cela, j'ai lu, mais ça me donne l'erreur:
grep: dir: est un répertoire
Ensuite, j'ai essayé d'exécuter grep
sur plusieurs fichiers.
grep "string" .bashrc .bash_aliases
fonctionne parfaitement.
grep "string" .bash*
fonctionne aussi comme prévu.
grep "string" *
me donne les erreurs:
grep: data: Is a directory
grep: Desktop: Is a directory
grep: Documents: Is a directory
grep: Downloads: Is a directory
...
Seules les erreurs sont imprimées, je ne reçois pas les lignes correspondantes. J'ai essayé d'utiliser l'option -s
, mais en vain.
Alors, mes questions:
Pourquoi ne puis-je pas utiliser grep
dans un répertoire, comme dans (1), alors que je devrais pouvoir le faire? J'ai vu cela dans de nombreux exemples sur Internet.
Edit: Quand je dis "utiliser grep sur un répertoire", je veux dire "rechercher dans tous les fichiers de ce répertoire, à l'exclusion de ses sous-répertoires". Je pense que c’est ce que fait grep lorsque vous lui passez un répertoire à la place d’un fichier. Est-ce que je me trompe?
Veuillez me donner une explication sur le fonctionnement de grep
qui expliquerait le comportement des commandes dans (2).
Edit: Permettez-moi d'être plus spécifique. Pourquoi utiliser des caractères génériques pour spécifier plusieurs fichiers dans lesquels effectuer une recherche de travail avec .bash*
et non avec *
ou même ./*
?
Comment puis-je rechercher tous les fichiers d'un répertoire (et non ses sous-répertoires) en utilisant grep
?
Dans Bash, un glob ne sera pas étendu aux fichiers cachés. Par conséquent, si vous souhaitez rechercher tous les fichiers d'un répertoire, vous devez spécifier les fichiers cachés .*
et non cachés *
.
Pour éviter les erreurs "Est-ce qu'un répertoire", vous pouvez utiliser -d skip
, mais sur mon système, je reçois également une erreur grep: .gvfs: Permission denied
†, je suggère donc d’utiliser -s
, qui masque tous les messages d’erreur.
Donc, la commande que vous recherchez est:
grep -s "string" * .*
Si vous recherchez des fichiers dans un autre répertoire:
grep -s "string" /path/to/dir/{*,.*}
Une autre option consiste à utiliser le shell dotglob
, qui permettra à un glob d'inclure des fichiers cachés.
shopt -s dotglob
grep -s "string" *
Pour les fichiers dans un autre répertoire:
grep -s "string" /path/to/dir/*
† Quelqu'un a mentionné que je ne devrais pas avoir cette erreur. Ils ont peut-être raison - j'ai lu un peu mais je ne pouvais pas en faire moi-même la tête ou la queue.
Vous devez ajouter l’option -d skip
à.
Grep cherche dans les fichiers. Comme vous l'avez dit, vous pouvez effectuer une recherche récursive si vous souhaitez rechercher des fichiers dans un répertoire.
Par défaut, grep lira tous les fichiers et détectera les répertoires. Parce que par défaut vous n'avez pas défini quoi faire avec les répertoires avec l'option -d
, cela donne un résultat d'erreur.
Grep -d skip "string" serait uniquement à la recherche dans le répertoire parent.
Les anciens feraient probablement ceci:
find . -type f -print0 | xargs -0 grep "string"
Reformulation - vous voulez grep les fichiers dans un niveau de sous-répertoire, mais vous ne devez pas recurse si tous les sous-sous-répertoires?
grep forthis * */*
Ou si vous ne voulez pas que les fichiers du répertoire courant
grep forthis */*
Notez que cela ne trouvera pas les répertoires commençant par un point.
grep forthis .*/* */*
devrait faire ce travail.
Des paramètres de restriction -maxdepth
et -mindepth
sont également disponibles pour la commande find
.