bater
Usando a globstar
opçã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 Find
que 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 os
mó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 find
para a travessia recursiva, e essa é a ferramenta essencial para o trabalho. O que precisa ser mencionado é o fato de find
haver várias opções de linha de comando, como -printf
imprimir a saída no formato desejado, -type f
encontrar apenas arquivos regulares, -inum
pesquisar pelo número do inode, -mtime
pesquisar 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 find
espaço reservado padrão para o arquivo atual) e muitos outros, por isso, leia a página de manual find
.
ls -R | grep .xml