golpetazo
Usando la globstar
opció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 Find
que 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 os
mó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 find
para el recorrido recursivo, y esa es la herramienta de referencia para el trabajo. Lo que sí necesita mencionar es el hecho de que find
tiene varios interruptores de línea de comandos, como -printf
imprimir la salida en el formato deseado, -type f
buscar solo archivos regulares, -inum
buscar por número de inodo, -mtime
buscar 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 find
marcador 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