bash
Mit der globstarShell-Option können wir rekursives Globbing verwenden./**/*
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 verfügt über ein Modul Find, das die rekursive Durchquerung von Verzeichnisbäumen ermöglicht. Innerhalb der Sonderfunktion find()können wir ein gewünschtes Unterprogramm und das Verzeichnis definieren, das wir durchlaufen möchten, in diesem Beispiel also .. Der Einzeiler in einem solchen Fall wäre:
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
Während Perl ein ganzes Modul für die rekursive Durchquerung von Bäumen hat, hat Python eine nette Funktion walk(), die Teil des osModuls ist und wiederholt Tupel des obersten Pfads, Liste aller Unterverzeichnisse und Liste der Dateinamen zurückgibt. Wir können Folgendes tun:
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
Das könnte als Skript viel ordentlicher sein:
#!/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))
finden
Andere Antworten haben findfür rekursives Durchlaufen erwähnt, und das ist das Werkzeug für den Job. Was erwähnt werden muss, ist die Tatsache, dass findmehrere Befehlszeilenschalter vorhanden sind, um beispielsweise -printfdie Ausgabe im gewünschten Format zu drucken -type f, nur reguläre Dateien zu finden, -inumnach der Inode-Nummer -mtimezu suchen, nach dem Änderungsdatum zu suchen und -exec <command> {} \;einen bestimmten Befehl zum Verarbeiten der Datei auszuführen mit übergebender Datei als Argument (wobei der {}Standardplatzhalter findfür die aktuelle Datei ist), und vielen anderen, lesen Sie bitte die Manpage für find.
ls -R | grep .xml