En suivant les conseils sous cette question, je suis en mesure de grep récursivement pour une chaîne string
dans le contenu dun répertoire donné dir
comme suit
grep -r --exclude-dir=".*" string dir
Cependant, lorsque japplique cela au répertoire actuel, comme
$ grep -r --exclude-dir=".*" string . $
je nobtiens aucun résultat, car le --exclude-dir=".*"
Loption omet le répertoire courant comme caché car il correspond à ".*"
.
Une solution consiste à passer au répertoire parent via cd ..
, puis exécutez la commande sur lenfant approprié, puis cd
à nouveau dans ce répertoire de travail dorigine. Il doit y avoir une seule commande que je puisse utiliser pour faire cela sans le contournement de changer de répertoire.
Quest-ce quune commande unique pour grep le contenu du répertoire courant, en omettant le contenu des répertoires cachés?
Réponse
Si vous utilisez GNU grep 2.11 ou version ultérieure, -r
démarrera à partir du répertoire actuel si aucun répertoire nest spécifié:
grep -r --exclude-dir=".*" string
Commentaires
Réponse
Dans le shell glob (également connu sous le nom de modèles de nom de fichier), .
na pas de signification particulière, *
signifie zéro ou plusieurs caractères, et ?
signifie un seul caractère.
Ce que vous voulez exclure est un point suivi par au moins un caractère, puis nimporte quel nombre de caractères. Utilisez donc:
grep -r --exclude-dir=".?*" string .
Answer
Depuis bash
naura pas grep
traverser les répertoires masqués par défaut (cest-à-dire sans dotglob
activé:
$ tree -a . ├── .test │ ├── .file │ └── file ├── file └── test ├── .file └── file 2 directories, 5 files $ grep -r foo * file:foo test/.file:foo test/file:foo
Exclure simplement les fichiers cachés:
$ grep --exclude=".*" -r foo * file:foo test/file:foo
Commentaires
- Je suis curieux de connaître le raisonnement qui sous-tend le vote défavorable non commenté.
- Je nai ' vote défavorable, mais ' nest pas vrai que
grep
ne ' t traverse les répertoires masqués. Ce que vous ' voir avecgrep -r foo *
est que le shell glob*
ne ' t développer pour inclure les répertoires / fichiers masqués, à moins quedotglob
ait été défini avecshopt -s dotglob
. Essayez avecgrep -r foo .
et vous ' Je verrai les répertoires cachés sont traversés par grep. Ou essayez avecshopt -s dotglob
puisgrep -r foo *
. - Bon point; Jai clarifié cela dans ma réponse.
- Cela cherchera toujours les fichiers dans les répertoires cachés contenus dans les arguments de la ligne de commande. Cela fonctionnera en quelque sorte . Dans la plupart des cas, cela peut convenir, mais ' est comme définir " pi " comme " 3.1416 "; vous connaissez mieux les mises en garde.
Réponse
Vous pouvez également spécifier le répertoire actuel en utilisant $(pwd)
comme:
grep -r --exclude-dir=".*" string "$(pwd)"
Commentaires
- Citez votre substitution de commande:
"$(pwd)"
Voir aussi Pourquoi mon script shell sétouffe-t-il avec des espaces ou dautres caractères spéciaux?
Réponse
Pour récurer à lintérieur dun unique (sans limiter les sous-répertoires des fichiers cachés) utilisez:
Comme echo dir/*
affichera tous les fichiers dans le répertoire, cela fonctionnera pour les fichiers dans un répertoire:
$ grep -r "string" $(echo dir/*)
remplacez simplement dir
par .
(point) et vous obtiendrez exactement ce que vous voulez:
$ grep -r "string" $(echo ./*)
Si vous navez besoin daucun fichier caché dans lun des sous-répertoires, utilisez:
$ grep -r --exclude-dir=".*" "string"
Ou utilisez find:
find . -not -path "*/\.*" -type f -exec grep "string" {} \+
grep
, il produit:grep: warning: recursive search of stdin