Lorsque je veux effectuer une recherche grep récursive dans le répertoire en cours, je fais généralement:
grep -ir "string" .
Mais cette commande effectue une recherche dans toutes sortes de fichiers, y compris des fichiers binaires (images, audio, vidéo, etc.), ce qui ralentit considérablement le processus de recherche.
Si je fais cela, par exemple, ça ne marche pas:
grep -ir "string" *.php
Cela ne fonctionne pas car il n'y a pas de fichiers PHP dans le répertoire en cours, mais dans certains sous-répertoires du répertoire en cours, et les noms des sous-répertoires ne se terminent pas par ".php", donc grep ne les examine pas.
Alors, comment puis-je faire une recherche récursive à partir du répertoire actuel mais en spécifiant des jokers de nom de fichier? (ie: rechercher uniquement dans les fichiers se terminant par une extension spécifique)
grep -ir "string" --include="*.php" *
Si vous avez une version de
grep
cette--include
option qui manque , vous pouvez utiliser ce qui suit. Celles-ci ont été testées sur une structure de répertoire comme celle-ci:Où tous les
.php
fichiers contiennent la chaînestring
.Utilisation
find
Explication
Cela va trouver tous les
.php
fichiers et ensuite exécutergrep -H string
sur chacun d'eux. Avecfind
l'-exec
option,{}
est remplacé par chacun des fichiers trouvés. Le-H
ditgrep
d'imprimer le nom du fichier ainsi que la ligne correspondante.En supposant que vous ayez une nouvelle version suffisante de
bash
, utilisezglobstar
:Explication
Comme expliqué dans le manuel de bash :
Donc, en exécutant,
shopt -s globstar
vous activez la fonctionnalité et l'globstar
option de Bash qui permet de**/*php
développer tous les.php
fichiers du répertoire en cours (**
correspond à 0 ou plusieurs répertoires, donc**/*php
correspond./foo.php
également) qui sont ensuite recherchésstring
.la source
Utilisation
*/*.php
Cela fait de grep search un niveau de sous-répertoire
la source