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

  • Bon pour inclure la note de version. Avec BSD grep, il produit: grep: warning: recursive search of stdin

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 avec grep -r foo * est que le shell glob * ne ' t développer pour inclure les répertoires / fichiers masqués, à moins que dotglob ait été défini avec shopt -s dotglob. Essayez avec grep -r foo . et vous ' Je verrai les répertoires cachés sont traversés par grep. Ou essayez avec shopt -s dotglob puis grep -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

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" {} \+ 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *