J'aimerais savoir comment trouver tous les fichiers dont l'extension peut être .xml
et .py
et qui contiennent la chaîne "Jason" sous un chemin "./" de manière récursive.
Ou comment pourrais-je exclure .po
de la recherche?
Vous pouvez le faire avec grep uniquement (sans utiliser find):
grep --include=\*.{xml,py} -Rl ./ -e "Jason"
Et pour exclure .po:
grep --exclude=*.po --include=\*.{xml,py} -Rl ./ -e "Jason"
Essayez la commande suivante. Il recherchera votre nom uniquement dans les fichiers .xml
et .py
find . -type f \( -iname \*.xml -o -iname \*.py \) | xargs grep "Jason"
J'espère que cela t'aides!
Cela peut être fait en combinant find
et grep
. Voici une petite démo - j'ai un répertoire de test avec 6 fichiers txt et rtf, dont deux contiennent la chaîne "Jason".
CURRENT DIR:[/home/xieerqi/testdir]
$ find . -type f \( -iname "*.txt" -o -iname "*.rtf" \) -exec grep -iR 'jason' {} +
./foo1.txt:Jason
./bar1.txt:Jason
CURRENT DIR:[/home/xieerqi/testdir]
$ ls
bar1.rtf bar1.txt bar2.rtf bar2.txt foo1.rtf foo1.txt foo2.rtf foo2.txt
CURRENT DIR:[/home/xieerqi/testdir]
$ find . -type f \( -iname "*.txt" -o -iname "*.rtf" \) -exec grep -iR 'jason' {} +
./foo1.txt:Jason
./bar1.txt:Jason
Nous trouvons ici tous les fichiers avec les extensions txt et rtf et les donnons tous comme paramètres à grep. Le .
signifie une recherche dans le répertoire en cours, mais vous pouvez spécifier un autre chemin et find
descendra dans ce répertoire et dans les sous-répertoires, afin d'effectuer une recherche récursive.
En remplaçant les extensions par les votres, la réponse finale est:
find . -type f \( -iname "*.xml" -o -iname "*.py" \) -exec grep -iR 'jason' {} +
Personne n'a probablement déjà fourni la meilleure solution. Cependant, lorsque l'outil ne prend pas en charge la recherche récursive des noms de fichiers dans un répertoire, vous pouvez activer l'option globstar
de bash
et effectuer une analyse globale récursive:
shopt -s globstar; grep -F -l Jason **/*.{xml,py}
user@user-X550CL:~/tmp$ tree -a
.
└── dir1
└── dir
├── containing_Jason.py
├── containing_Jason.txt
├── containing_Jason.xml
├── not_containing_Jason.py
├── not_containing_Jason.txt
└── not_containing_Jason.xml
2 directories, 6 files
user@user-X550CL:~/tmp$ shopt -s globstar
user@user-X550CL:~/tmp$ grep -F -l Jason **/*.{xml,py}
dir1/dir/containing_Jason.xml
dir1/dir/containing_Jason.py
La fonctionnalité équivalente dans zsh
est activée par défaut:
grep -F -l Jason **/*.{xml,py}
user@user-X550CL ~/tmp % tree -a
.
└── dir1
└── dir
├── containing_Jason.py
├── containing_Jason.txt
├── containing_Jason.xml
├── not_containing_Jason.py
├── not_containing_Jason.txt
└── not_containing_Jason.xml
2 directories, 6 files
user@user-X550CL ~/tmp % grep -F -l Jason **/*.{xml,py}
dir1/dir/containing_Jason.xml
dir1/dir/containing_Jason.py
Vous pouvez faire ceci:
grep -r "Jason" ./ | grep .xml; grep -r "Jason" ./ | grep .py
Cela affichera la sortie de tous les fichiers contenant Jason
et le limitera aux noms de fichiers contenant .xml
ou .py
.
Si vous voulez simplement exclure .po
, essayez ceci:
grep -r "Jason" | grep -v .po
Comment je comprends de votre question ci-dessus, vous devez afficher tous les fichiers avec "Jason" chaîne dans. Alors, peut-être que cela peut vous aider:
find . -type f \( -name "*.xml" -o -name "*.py" \) | grep -r "Jason" | cut -d':' -f1 | uniq