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
.