golpetazo
Usando la globstaropción de shell, podemos hacer uso del engrosamiento 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
Perl tiene un módulo Findque permite el recorrido recursivo del árbol de directorios. Dentro de la find()función especial , podemos definir una subrutina deseada y el directorio que queremos recorrer, en este ejemplo eso es .. La frase en este caso sería:
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ón
Si bien Perl tiene un módulo completo dedicado al recorrido recursivo del árbol, Python tiene una función ordenada walk()que forma parte del osmódulo y devuelve repetidamente la tupla de la ruta superior, la lista de todos los subdirectorios y la lista de nombres de archivo. Podemos hacer lo siguiente:
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
Esto podría ser mucho más ordenado como 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
Se han mencionado otras respuestas findpara el recorrido recursivo, y esa es la herramienta de referencia para el trabajo. Lo que sí necesita mencionar es el hecho de que findtiene varios interruptores de línea de comandos, como -printfimprimir la salida en el formato deseado, -type fbuscar solo archivos regulares, -inumbuscar por número de inodo, -mtimebuscar por fecha de modificación, -exec <command> {} \;ejecutar un comando particular para procesar el archivo con el archivo de paso como argumento (donde {}es el findmarcador de posición estándar para el archivo actual), y muchos otros, así que lea la página de manual para find.
ls -R | grep .xml