bater
Usando a globstaropção shell, podemos fazer uso de globbing recursivo./**/*
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
O Perl possui um módulo Findque permite a travessia recursiva da árvore de diretórios. Dentro da find()função especial , podemos definir uma sub-rotina desejada e o diretório que queremos percorrer, neste exemplo, é isso .. O one-liner nesse caso seria:
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
Pitão
Enquanto o Perl tem um módulo inteiro dedicado à passagem de árvore recursiva, o Python tem uma função elegante walk()que faz parte do osmódulo e retorna repetidamente a tupla do caminho superior, lista de todos os subdiretórios e lista de nomes de arquivos. Podemos fazer o seguinte:
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
Isso pode ser muito mais limpo como um script:
#!/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))
encontrar
Outras respostas foram mencionadas findpara a travessia recursiva, e essa é a ferramenta essencial para o trabalho. O que precisa ser mencionado é o fato de findhaver várias opções de linha de comando, como -printfimprimir a saída no formato desejado, -type fencontrar apenas arquivos regulares, -inumpesquisar pelo número do inode, -mtimepesquisar pela data da modificação, -exec <command> {} \;executar um comando específico para processar o arquivo com a passagem do arquivo como argumento (onde {}é o findespaço reservado padrão para o arquivo atual) e muitos outros, por isso, leia a página de manual find.
ls -R | grep .xml