удар
С помощью globstar
опция оболочки, мы можем использовать рекурсивное глобулирование ./**/*
bash-4.3$ shopt -s globstarbash-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 pythonimport 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
.