Comment Rechercher des fichiers récursivement dans des Sous-répertoires

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

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

Est-ce un problème de configuration?

Vous pouvez le faire avec trouver seulement:

find . -name '*.xml'

. est le répertoire courant. Si vous devez effectuer une recherche dans un autre répertoire, remplacez . avec le chemin du répertoire.

Essayez d'utiliser Trouver

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

Essayez cette commande:

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

ls n'a pas d'options pour filtrer la sortie. Pour cela, vous devez utiliser pipe. Cela passe la sortie de ls de grep, qui les filtre ensuite pour afficher uniquement les .xml fichier.

bash

Utiliser globstar option shell, nous pouvons utiliser le globbing récursif ./**/*

bash-4.3$ shopt -s globstarbash-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 des répertoires. Dans le cadre de la spéciale find() fonction, nous pouvons définir un sous-programme souhaité et le répertoire que nous voulons parcourir, dans cet exemple c'est .. Le one-liner dans un tel 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 d'arbres récursive, Python a une fonction soignée 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 comme script:

#!/usr/bin/env pythonimport 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 la traversée récursive, et c'est l'outil incontournable 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 la sortie dans le format souhaité, -type f pour trouver uniquement les fichiers normaux, -inum pour rechercher par numéro d'inode, -mtime pour rechercher par date de modification, -exec <command> {} \; pour exécuter une commande particulière pour traiter le fichier en passant file comme argument (où {} est standard find espace réservé pour le fichier actuel), et bien d'autres, veuillez donc lire la page de manuel pour find.

Dans le gestionnaire de fichiers Gnome, vous pouvez cliquer sur l'icône en forme de loupe (en haut à droite généralement), puis commencer à taper pour rechercher dans le dossier actuel.

Pour certaines personnes (moi), c'est beaucoup plus facile que d'utiliser la ligne de commande.

Vous pouvez faire ls-R / grep .XML