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


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


75
2017-11-06 22:07


origen


Respuestas:


Esto funcionará en Bash 4:

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

Para que el glob doble asterisco funcione, la globstar la opción necesita ser configurada (por defecto: 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.

91
2017-11-06 23:22



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

find . -name '*.ext' -print

10
2017-11-06 22:11



Puedes usar: **/*.* para incluir todos los archivos recursivamente (habilitar por: shopt -s globstar)

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


Carpeta de prueba con 3472 archivos en la muestra VLC carpeta de repositorio:

(Total de archivos de 3472 contados según: find . -type f | wc -l)

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

Así que creo que el método más cercano para enumerar todos los archivos recursivamente es el primer ejemplo (**/*.*) según gniourf-gniourf comentario (suponiendo que los archivos tienen las extensiones adecuadas, o use el específico), ya que el segundo ejemplo da pocos más duplicados 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 (desactivar por shopt -u dotglob) No es recomendable, ya que puede afectar comandos como mv o rm y puedes eliminar accidentalmente los archivos incorrectos.


4
2018-04-19 14:28



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


3
2017-11-06 22:10



¿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 el liderazgo ./ en tus patrones glob.


2
2018-05-09 23:30