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