frapper
En utilisant l' globstar
option shell, nous pouvons utiliser la méthode 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 une traversée récursive de l’arborescence de répertoires. Dans la find()
fonction spéciale , nous pouvons définir un sous-programme souhaité et le répertoire que nous voulons parcourir, dans cet exemple .
. 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 tout un module dédié à la traversée d'arbres récursive, Python a une fonction soignée walk()
qui fait partie du 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 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 été mentionnées find
pour la traversée récursive, et c'est l'outil de prédilection pour le travail. Ce qu'il faut mentionner, c’est le fait qu’il find
existe plusieurs commutateurs de ligne de commande, par exemple -printf
imprimer la sortie au format souhaité, -type f
rechercher uniquement les fichiers normaux, -inum
rechercher par numéro d’inode, -mtime
rechercher par date de modification, -exec <command> {} \;
exécuter une commande particulière pour traiter le fichier. en passant le fichier comme argument (où {}
est l’ find
espace réservé standard pour le fichier actuel), et beaucoup d’autres, merci de lire la page de manuel pour find
.
ls -R | grep .xml