bash
Usando l' globstar
opzione shell, possiamo usare il globbing ricorsivo./**/*
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 ha un modulo Find
, che consente l'attraversamento di alberi di directory ricorsivi. All'interno della find()
funzione speciale , possiamo definire una subroutine desiderata e la directory che vogliamo attraversare, in questo esempio .
. Il one-liner in tal caso sarebbe:
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
Pitone
Mentre Perl ha un intero modulo dedicato alla traslazione di alberi ricorsivi, Python ha una funzione ordinata walk()
che fa parte del os
modulo e restituisce ripetutamente tupla del percorso più in alto, elenco di tutte le sottodirectory e elenco di nomi di file. Possiamo fare quanto segue:
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
Questo potrebbe essere molto più ordinato come uno 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))
trova
Altre risposte sono state menzionate find
per l'attraversamento ricorsivo e questo è lo strumento ideale per il lavoro. Ciò che è necessario menzionare è il fatto che find
ha più opzioni della riga di comando, come -printf
stampare l'output nel formato desiderato, -type f
trovare solo file regolari, -inum
cercare per numero di inode, -mtime
cercare per data di modifica, -exec <command> {} \;
eseguire un comando particolare per elaborare il file con il passaggio del file come argomento (dove {}
è il find
segnaposto standard per il file corrente) e molti altri, per favore leggi la manpage per find
.
ls -R | grep .xml