удар
Использование globstar
опции оболочки, мы можем использовать рекурсивное глобирование./**/*
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