2010-08-20 12 views
21

En Ryan Bates Railscast about git, su .gitignore archivo contiene la siguiente línea:Selectores comodín de Unix? (Asteriscos)

tmp/**/*

¿Cuál es el propósito de la utilización de los asteriscos dobles seguidos de un asterisco como tal: **/*? ¿Usaría simplemente tmp/* en lugar de tmp/**/* para no obtener exactamente el mismo resultado?

Haciendo búsquedas en el problema, encontré un artículo poco claro de IBM al respecto, y me preguntaba si alguien podría aclarar el problema.

+0

Nota: Si bien algunas conchas apoyan esta sintaxis, Git no lo hace. En un archivo '.gitignore' esto es equivalente a' tmp/*/* '. – hammar

Respuesta

24

Dice que vaya a todos los subdirectorios debajo de tmp, así como solo el contenido de tmp.

p. Ej. Tengo el siguiente:

$ find tmp 
tmp 
tmp/a 
tmp/a/b 
tmp/a/b/file1 
tmp/b 
tmp/b/c 
tmp/b/c/file2 

salida encontrados:

$ echo tmp/* 
tmp/a tmp/b 

salida encontrados:

$ echo tmp/**/* 
tmp/a tmp/a/b tmp/a/b/file1 tmp/b tmp/b/c tmp/b/c/file2 

Es una función predeterminada de zsh, para conseguir que funcione en bash 4, se realizar:

shopt -s globstar 
+1

gran explicación. ¡Gracias! –

+0

¿Hay nomenclatura para este tipo de coincidencia de patrones en Unix? Estoy tratando de encontrar más información y no sé cómo buscarla en Google. – Jondlm

+0

La coincidencia de patrones para archivos se denomina globbing. Las variantes básicas son '*' para 0 o más caracteres, '?' Para cualquier carácter y '[CharacterRange]' para los caracteres que coinciden con un rango particular, p. '[0-9]' para unir un dígito. Algunos shells lo extienden a su manera, lo que incluye la sintaxis '**'. – Petesh

5

De http://blog.privateergroup.com/2010/03/gitignore-file-for-android-development/:

(kwoods)

"The double asterisk (**) is not a git thing per say, it’s really a linux/Mac shell thing. 

It would match on everything including any sub folders that had been created. 

You can see the effect in the shell like so: 

# ls ./tmp/* = should show you the contents of ./tmp (files and folders) 
# ls ./tmp/** = same as above, but it would also go into each sub-folder and show the contents there as well." 
1

Según the documentation of gitignore, esta sintaxis está soportado desde la versión git 1.8.2.

Aquí está la sección correspondiente: asteriscos

dos consecutivos (**) en los patrones compara con ruta completa puede tener un significado especial:

  • Un líder ** seguido de una barra significa coincidencia en todos los directorios Por ejemplo, **/foo coincide con el archivo o directorio foo en cualquier lugar, el igual que el patrón foo. **/foo/bar coincide con el archivo o directorio bar en cualquier parte que se encuentre directamente bajo el directorio foo.

  • A trailing /** coincide con todo dentro. Por ejemplo, abc/** coincide con todos los archivos dentro del directorio abc, relativo a la ubicación del archivo .gitignore, con profundidad infinita.

  • Una barra seguida de dos asteriscos consecutivos y una barra inclinada coincide con cero o más directorios. Por ejemplo, a/**/b coincide con a/b, a/x/b, a/x/y/b y así sucesivamente.

  • Otros asteriscos consecutivos se consideran no válidos.