wildcards traduccion caracteres bash shell wildcard glob

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



glob traduccion (5)

¿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.

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 If set, the pattern ** used in a filename expansion con‐ text will match a files and zero or more directories and subdirectories. If the pattern is followed by a /, only directories and subdirectories match.


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 repositorio 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".