2010-12-03 20 views
18

¿Hay alguna manera de usar el shell Globbing para identificar directorios anidados?Coincidencia de todos los archivos en todos los directorios anidados con shell globbing

así que si tengo dir/dir1/dir2/dir3/dir4/dir5/.. y tengo archivos debajo de todos ellos, ¿cuál es el patrón globbing equivalente para unir todos los archivos en todos los directorios, similar a - por ejemplo - ls -R

+0

votado para mover a SuperUser.com. ¿Por qué está etiquetado 'git'? – meagar

+0

gitignore no usa globbing de shell; esa es una pregunta separada. – Cascabel

+0

Similar: [¿Qué se expande a todos los archivos en el directorio actual recursivamente?] (Http://stackoverflow.com/q/1690809/55075) en SO – kenorb

Respuesta

19

En Bash 4, con shopt -s globstar, y Zsh puede utilizar **/* que incluirá todo excepto los archivos ocultos. Puede hacer shopt -s dotglob en Bash 4 o setopt dotglob en zsh para hacer que se incluyan archivos ocultos.

En ksh, set -o globstar lo habilita. No creo que haya una forma de incluir archivos de puntos implícitamente, pero creo que **/{.[^.],}* funciona.

+0

¡Eso es genial! ¿se analizarán los archivos para la creación de contornos del shell (como por ejemplo .gitignore)? –

+0

@Samer Abukhait: Si el caparazón está haciendo globbing, debería. –

+2

@Samer: Pero gitignore no está usando globbing de shell, está usando fnmatch. – Cascabel

0

No hay forma de hacer esto con Bash vainilla, sin embargo la mayoría de los comandos aceptan una opción -R o --recursive para indicarles que desciendan a los directorios.

Si simplemente desea enumerar todos los archivos ubicados en cualquier lugar dentro de un directorio o sus subdirectorios, puede usar find.

Para encontrar de forma recursiva archivos (-type f) con un directorio dado:

find <directory> -type f 
+0

@ Matt Gracias Matt. – meagar

0

Puede usar tree, se mostrarán todas las carpetas recursivamente.

tree <path> 
+0

Pero no puede usar eso como argumento para un comando. –

1

Si desea actuar sobre todos los archivos devueltos por hallazgo, en lugar de sólo una lista de ellos, se puede canalizar a xargs:

find <directory> -type f | xargs ls 

Pero esto es sólo para los comandos que no lo hacen tener una bandera recursiva

6

Específicamente sobre git (gitignore, gitattributes y comandos que toman nombres de archivo): si el patrón no contiene barras, los comodines * coincidirán profundamente. Si contiene una barra oblicua, git will call fnmatch con el indicador FNM_PATHNAME, y los comodines simples no coincidirán con las barras diagonales. ** para que coincida con la profundidad no es compatible. Tal vez este tipo de coincidencia profunda podría ser más ampliamente compatible con una nueva bandera FNM_STARSTAR, y una implementación en glibc, gnulib y otros lugares.

Cuestiones relacionadas