баш
Використовуючи globstar
параметр shell, ми можемо скористатися рекурсивним глобулюванням./**/*
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 є модуль Find
, який дозволяє здійснювати рекурсивне обхід дерева каталогів. У межах спеціальної find()
функції ми можемо визначити шукану підпрограму та каталог, який ми хочемо перейти, у цьому прикладі це .
. Однопластовим в такому випадку буде:
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
Пітон
Хоча Perl має цілий модуль, присвячений рекурсивному обходу дерева, Python має акуратну функцію, walk()
яка є частиною os
модуля, і неодноразово повертає кортеж верхнього шляху, список усіх підкаталогів та список імен. Ми можемо зробити наступне:
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
Це може бути набагато акуратніше як сценарій:
#!/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))
знайти
Інші відповіді згадували find
про рекурсивний обхід, і це головний інструмент для роботи. Що потрібно згадати, це той факт, що find
є декілька комутаторів командного рядка, наприклад, -printf
для друку виводу у бажаному форматі, -type f
пошуку лише звичайних файлів, -inum
пошуку за номером вводу, -mtime
пошуку за датою модифікації, -exec <command> {} \;
виконання певної команди для обробки файлу з передаючим файлом як аргументом (де {}
стандартний find
заповнювач заповнення для поточного файлу) та багатьма іншими, тому, будь ласка, прочитайте сторінку сторінки find
.
ls -R | grep .xml