web-dev-qa-db-fra.com

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

J'essaie de rechercher tous les fichiers XML dans un répertoire particulier et tous les sous-répertoires (récursivement) qu'il contient.

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

Est-ce un problème de configuration?

108
Shamim Hafiz

Essayez d'utiliser Find

Sudo find . -print | grep -i '.*[.]xml'
82
Mitch

Vous pouvez le faire avec trouver seulement:

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.

139
KaeruCT

Essayez cette commande:

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

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

13
Rohit Jain

bash

En utilisant l’option globstar Shell, nous pouvons utiliser l’utilisation de la méthode de redimensionnement récursif ./**/*

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 de l’arborescence de répertoires. Dans la fonction spéciale find(), nous pouvons définir un sous-programme souhaité et le répertoire que nous voulons parcourir, dans cet exemple, il s'agit de .. 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 d’arbres, Python a une fonction soignée walk() qui fait partie du module os et renvoie à plusieurs reprises Tuple du chemin le plus haut, liste de tous les sous-répertoires et 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 mieux comme 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))

trouver

D'autres réponses ont mentionné find pour une traversée récursive, et c'est l'outil idéal pour le travail. Ce qu'il faut mentionner, c’est le fait que find possède plusieurs commutateurs de ligne de commande, tels que -printf pour imprimer le résultat au format souhaité, -type f pour ne trouver que les fichiers normaux, -inum pour rechercher par numéro d’inode, -mtime pour rechercher par date de modification, -exec <command> {} \; commande particulière pour traiter le fichier avec le fichier transmis en tant qu'argument (où {} est le caractère générique standard find pour le fichier en cours) et bien d'autres. Veuillez donc lire la page de manuel pour find.

3
Sergiy Kolodyazhnyy