grzmotnąć
Korzystając z globstar
opcji powłoki, możemy skorzystać z rekurencyjnego globowania./**/*
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 ma moduł Find
, który pozwala na rekurencyjne przechodzenie przez drzewo katalogów. W ramach find()
funkcji specjalnej możemy zdefiniować pożądany podprogram i katalog, który chcemy przejść, w tym przykładzie to .
. Jednowarstwowy w takim przypadku to:
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
Pyton
Podczas gdy Perl ma cały moduł dedykowany do przechodzenia przez rekurencyjne drzewo, Python ma zgrabną funkcję, walk()
która jest częścią os
modułu i wielokrotnie zwraca krotkę najwyższej ścieżki, listę wszystkich podkatalogów i listę nazw plików. Możemy wykonać następujące czynności:
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
Może to być o wiele fajniejsze jako skrypt:
#!/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))
odnaleźć
Inne odpowiedzi wspomniano find
o rekursywnym przechodzeniu, a to narzędzie do zadania. Należy wspomnieć o tym, że find
ma wiele przełączników wiersza poleceń, takich jak -printf
drukowanie danych wyjściowych w pożądanym formacie, -type f
wyszukiwanie tylko zwykłych plików, -inum
wyszukiwanie według numeru i-węzła, -mtime
wyszukiwanie według daty modyfikacji, -exec <command> {} \;
wykonywanie określonego polecenia w celu przetworzenia pliku z przekazaniem pliku jako argumentu (gdzie {}
jest standardowym find
symbolem zastępczym dla bieżącego pliku) i wieloma innymi, więc proszę przeczytać stronę podręcznika dla find
.
ls -R | grep .xml