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

89

J'essaie de rechercher tous les fichiers XML dans un répertoire particulier et tous les sous-répertoires (de manière récursive) à l'intérieur.

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

Est-ce un problème de configuration?

    
posée Shamim Hafiz 13.06.2013 - 22:06
la source

4 réponses

68

Essayez d’utiliser Rechercher

sudo find . -print | grep -i '.*[.]xml'
    
réponse donnée Mitch 13.06.2013 - 22:16
la source
116

Vous pouvez le faire avec rechercher uniquement:

find . -name '*.xml'

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

    
réponse donnée KaeruCT 13.06.2013 - 22:22
la source
11

Essayez cette commande:

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

ls n'a pas d'options pour filtrer la sortie. Pour cela, vous devez utiliser un tuyau. Cela transmet la sortie de ls à grep , qui les filtre ensuite pour afficher uniquement les fichiers .xml .

    
réponse donnée Rohit Jain 13.06.2013 - 22:10
la source
1

bash

En utilisant l’option globstar 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 la traversée récursive des arborescences de répertoires. Dans la fonction spéciale find() , nous pouvons définir un sous-programme voulu et le répertoire que nous voulons parcourir, dans cet exemple, . . Dans un tel cas, le one-liner 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

Bien que Perl ait un module entier dédié au parcours d'arbres récursifs, Python a une fonction intéressante walk() qui 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 simple 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))
    
réponse donnée Sergiy Kolodyazhnyy 13.07.2017 - 04:43
la source

Lire d'autres questions sur les étiquettes