2009-11-06 19 views
66

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

+2

¿qué tal encontrar? – Aif

+4

Mi bash no maneja '**/*. Ext'. ¿Estás seguro de que funciona para ti? – tangens

+0

@tangens Tienes que habilitar la opción 'globstar' según la respuesta de Dennis. – kenorb

Respuesta

82

Esto funcionará en Bash 4:

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

Para que el pegote de doble asterisco al trabajo, la opción globstar es necesario establecer (por defecto: 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. 
+4

Probé Ubuntu y Cygwin, y 'globstar' está predeterminado' off' –

+11

¡La mejor respuesta! pero creo que '**/*. ext' debería ser suficiente sin embargo. Además, no tendrá los archivos ocultos a menos que 'shopt -s dotglob'. –

+0

My Centos 6 Bash 4.1.2 también se desactiva de forma predeterminada para la opción globstar. – toxalot

3
$ find . -type f 

Eso listará todos los archivos en el directorio actual. A continuación, puede hacer algún otro comando en la salida usando -exec

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

Eso se grep cada archivo del hallazgo para la cadena "foo".

10

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

find . -name '*.ext' -print 
4

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

Por favor encuentre abajo la prueba de otras variaciones y cómo se comportan.


carpeta de pruebas con 3472 archivos de la carpeta VLC repositorio de pruebas:

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

  • ls -1 **/*.* - retornos 3338
  • ls -1 {,**/}*.* - devuelve 3341 (según lo propuesto por Dennis)
  • ls -1 {,**/}* - devuelve 8265
  • ls -1 **/* - retornos 7817, con excepción de los archivos ocultos (como propone Dennis)
  • ls -1 **/{.[^.],}* - retornos 7869 (según lo propuesto por Dennis)
  • ls -1 {,**/}.?* - Devuelve 15855
  • ls -1 {,**/}.* - devuelve 20321

Creo que el método más cercano para enumerar todos los archivos recursiv Ely es el primer ejemplo (**/*.*) como por gniourf-gniourf comment (suponiendo que los archivos tienen las extensiones adecuadas, o utilizar el específico), como 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, utilice: shopt -s dotglob (desactivar por shopt -u dotglob). No se recomienda, porque puede afectar comandos como mv o rm y puede eliminar accidentalmente los archivos incorrectos.

+0

En la terminal Mac y bash con globstar habilitado, encontré la solución anterior ('' '**/*. *' '') Informativa y funcionó mejor. La respuesta aceptada causó duplicados de elementos en el directorio superior. Mi patrón de trabajo era: '' '" $ {path} "**/*. *' '' – mummybot

Cuestiones relacionadas