Question Comment rechercher des fichiers récursivement dans des sous-répertoires


J'essaye de chercher tout XML fichiers dans un répertoire particulier et tous les sous-répertoires (récursivement) à l'intérieur.

ls -R *.xml ne répertorie que les fichiers du répertoire en cours. Je suis tout à fait sûr que les sous-dossiers eux-mêmes ont plusieurs .xml fichiers, mais aucun ne s'affiche.

Est-ce un problème de configuration?


90
2018-06-13 20:06


origine


Tu peux faire ls -R | grep .xml - Nik-Lz


Réponses:


Essayez d'utiliser Trouver

sudo find . -print | grep -i '.*[.]xml'

68
2018-06-13 20:16



est le sudo doit, ou il est là pour assurer des privilèges de super utilisateur? - Shamim Hafiz
Je vous laisse décider. Sudo, Pas de sudo. - Mitch♦
Juste par intérêt. Quel est l'avantage de find plus de ls -R? - don.joey
@ don.joey Cela pourrait aider stackoverflow.com/questions/13830036/… - Mitch♦
-1 pour mélanger find et grep, quand find peut faire du filtrage en utilisant à la fois les regexes et les globs, et ne pas utiliser find's -print0 et grep -z quand vous avez besoin de mélanger. - muru


Vous pouvez le faire avec trouver seulement:

find . -name '*.xml'

. est le répertoire en cours. Si vous devez chercher dans un autre répertoire, remplacez . avec le chemin du répertoire.


119
2018-06-13 20:22



Recherche-t-il récursivement le fichier requis dans le répertoire racine du répertoire en cours? Dans mon cas, il a juste vérifié dans le répertoire actuel seulement, n'a pas vérifié le sous-répertoire. - mostafiz rahman
@mostafiz, vous devez citer la partie '* .xml'. Je vais éditer ma réponse. - KaeruCT
En fait, j'ai cherché .php fichiers dans le répertoire en cours. Mais il est revenu seulement .php fichiers dans le répertoire en cours, pas recherché récursivement dans les sous-répertoires. C'est pourquoi je demande si find la commande recherche de manière récursive ou non. - mostafiz rahman
@mostafiz, le find la commande recherche récursivement. Si vous ne citez pas le paramètre, je pense que votre shell pourrait faire une extension sur le *, il correspondra donc aux fichiers du répertoire en cours. - KaeruCT
D'accord! Peut-être que j'avais fait une erreur. Maintenant, ça marche parfaitement! - mostafiz rahman


Essayez cette commande:

ls -R | grep '.*[.]xml'

ls n'a pas d'options pour filtrer la sortie. Pour cela, vous devez utiliser un tuyau. Ceci passe la sortie de ls à grep, qui les filtre ensuite pour montrer juste la .xml des dossiers.


11
2018-06-13 20:10



Quoi qu'il en soit, pour que cela montre le répertoire d'où il vient? - AdamO
Lien obligatoire: Pourquoi ne pas analyser ls? - Ruslan


frapper

En utilisant globstar option shell, nous pouvons utiliser la globalisation récursive ./**/*

bash-4.3$ shopt -s globstar
bash-4.3$ for i in  ./**/*.xml; do printf "%s\n" "$i" ; done
./adwaita-timed.xml
./bin/hw5/stuff/book/chapter42servletexample/build/web/META-INF/context.xml
./bin/hw5/stuff/book/chapter42servletexample/build/web/WEB-INF/beans.xml
./bin/hw5/stuff/book/chapter42servletexample/build/web/WEB-INF/web.xml

Perl

Perl a un module Find, qui permet une traversée récursive des arborescences de répertoires. Dans le spécial find() fonction, nous pouvons définir un sous-programme voulu et le répertoire que nous voulons parcourir, dans cet exemple qui est .. Le one-liner dans ce cas serait:

bash-4.3$ perl -le 'use File::Find; find(sub{-f && $_ =~ /.xml$/ && print $File::Find::name},".")' 
./adwaita-timed.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/beans.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/web.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/liangweb/build.xml

Python

Alors que Perl a un module entier dédié à la traversée récursive des arbres, Python a une fonction intéressante walk() cela fait partie de os module, et renvoie à plusieurs reprises le tuple du chemin le plus haut, la liste de tous les sous-répertoires et la liste des noms de fichiers. Nous pouvons faire ce qui suit:

bash-4.3$ python -c 'import os,sys; [ sys.stdout.write(os.path.join(r,i)+"\n") for r,s,f in os.walk(".") for i in f if i.endswith(".xml") ]' 
./adwaita-timed.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/beans.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/web.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/liangweb/build.xml

Cela pourrait être beaucoup plus propre en tant que script:

#!/usr/bin/env python
import os,sys 
for r,s,f in os.walk("."): 
    for i in f: 
        if i.endswith(".xml") 
             print(os.path.join(r,i))

1
2017-07-13 02:43