web-dev-qa-db-fra.com

Trouver tous les fichiers avec des extensions spécifiques contenant une chaîne

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?

5
Jonathan Solorzano

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"
9
nobody

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!

3
Terrance

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' {} + 
1
Sergiy Kolodyazhnyy

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
0
kos

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
0
Daniel

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
0
Hamsternik