¿Qué se expande a todos los archivos en el directorio actual recursivamente?

Sé que **/*.ext expande a todos los archivos en todos los subdirectorios que coincidan con *.ext , pero ¿qué es una expansión similar que también incluye todos esos archivos en el directorio actual ?

Esto funcionará en Bash 4:

 ls -l {,**/}*.ext 

Para que el glob de doble asterisco funcione, la opción globstar debe establecerse (valor predeterminado: activado):

 shopt -s globstar 

De man bash :

     globstar
                   Si se establece, el patrón ** utilizado en una expansión de nombre de archivo
                   texto coincidirá con un archivo y cero o más directorios y
                   subdirectorios.  Si el patrón es seguido por a /, solo
                   directorios y subdirectorios coinciden.

Esto imprimirá todos los archivos en el directorio actual y sus subdirectorios que terminan en ‘.ext’.

 find . -name '*.ext' -print 

Puede usar: **/*.* Para incluir todos los archivos recursivamente (habilitado por: shopt -s globstar ).

A continuación encontrará pruebas de otras variaciones y cómo se comportan.


La carpeta de prueba con 3472 archivos en la carpeta de repository de muestra VLC :

(Total de archivos de 3472 contados como por: find . -type f | wc -l )

  • ls -1 **/*.* – devuelve 3338
  • ls -1 {,**/}*.* – devuelve 3341 (como lo propuso Dennis )
  • ls -1 {,**/}* – devuelve 8265
  • ls -1 **/* – devuelve 7817, excepto archivos ocultos (según lo propuesto por Dennis )
  • ls -1 **/{.[^.],}* – devuelve 7869 (como lo propuso Dennis )
  • ls -1 {,**/}.?* – devuelve 15855
  • ls -1 {,**/}.* – devuelve 20321

Así que creo que el método más cercano para enumerar todos los archivos de forma recursiva es el primer ejemplo ( **/*.* ) Según el comentario de gniourf-gniourf (suponiendo que los archivos tienen las extensiones adecuadas, o el específico), como el segundo ejemplo da algunos duplicados más como a continuación:

 $ diff -u <(ls -1 {,**/}*.*) <(ls -1 **/*.*) --- /dev/fd/63 2015-04-19 15:25:07.000000000 +0100 +++ /dev/fd/62 2015-04-19 15:25:07.000000000 +0100 @@ -1,6 +1,4 @@ COPYING.LIB -COPYING.LIB -Makefile.am Makefile.am @@ -45,7 +43,6 @@ compat/tdestroy.c compat/vasprintf.c configure.ac -configure.ac 

y el otro generar aún más duplicados.


Para incluir archivos ocultos, use: shopt -s dotglob (disable by shopt -u dotglob ). No se recomienda, ya que puede afectar comandos como mv o rm y puede eliminar accidentalmente los archivos incorrectos.

 $ find . -type f 

Eso mostrará una lista de todos los archivos en el directorio actual. Luego puede hacer otro comando en la salida usando -exec

 $find . -type f -exec grep "foo" {} \; 

Eso grep cada archivo del hallazgo para la cadena “foo”.

¿Por qué no usar la expansión de llaves para incluir también el directorio actual?

 ./{*,**/*}.ext 

La expansión de llaves ocurre antes de la expansión global, por lo que puedes hacer lo que quieras con versiones anteriores de bash, y puedes dejar de monkear con globstar en versiones más nuevas.

Además, se considera una buena práctica en bash incluir los primeros ./ en tus patrones globales.