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?
Essayez d'utiliser Find
Sudo find . -print | grep -i '.*[.]xml'
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.
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
.
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 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
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))
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
.