bash
Mit der globstar
Shell-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 os
Moduls 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 find
für rekursives Durchlaufen erwähnt, und das ist das Werkzeug für den Job. Was erwähnt werden muss, ist die Tatsache, dass find
mehrere Befehlszeilenschalter vorhanden sind, um beispielsweise -printf
die Ausgabe im gewünschten Format zu drucken -type f
, nur reguläre Dateien zu finden, -inum
nach der Inode-Nummer -mtime
zu 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 find
für die aktuelle Datei ist), und vielen anderen, lesen Sie bitte die Manpage für find
.
ls -R | grep .xml