usa - ¿Unix comodines selectores?(Asteriscos)
tipos de comodines (3)
En Railscast sobre git de Ryan Bates, su archivo .gitignore contiene la siguiente línea:
tmp/**/*
¿Cuál es el propósito de usar los asteriscos dobles seguidos por un asterisco como tal: **/*
? ¿El uso de simplemente tmp/*
lugar de tmp/**/*
no lograría exactamente el mismo resultado?
Buscando en Google el problema, encontré un artículo poco claro de IBM al respecto y me preguntaba si alguien podría aclarar el problema.
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."
Dice que debe ir a todos los subdirectorios debajo de tmp, así como solo el contenido de tmp.
por ejemplo tengo los siguientes
$ find tmp
tmp
tmp/a
tmp/a/b
tmp/a/b/file1
tmp/b
tmp/b/c
tmp/b/c/file2
salida coincidente:
$ echo tmp/*
tmp/a tmp/b
salida coincidente:
$ echo tmp/**/*
tmp/a tmp/a/b tmp/a/b/file1 tmp/b tmp/b/c tmp/b/c/file2
Es una característica predeterminada de zsh, para que funcione en bash 4, realiza:
shopt -s globstar
Según la documentación de gitignore , esta sintaxis es compatible desde la versión 1.8.2 de git.
Aquí está la sección correspondiente:
Dos asteriscos consecutivos (
**
) en patrones que coincidan con el nombre de ruta completo pueden tener un significado especial:
Un encabezado
**
seguido de una barra diagonal significa coincidir en todos los directorios. Por ejemplo,**/foo
coincide con el archivo o directoriofoo
cualquier lugar, igual que el patrónfoo
.**/foo/bar
coincide con el archivo o labar
directorio en cualquier lugar que esté directamente debajo del directoriofoo
.Un final
/**
coincide con todo lo que hay dentro. Por ejemplo,abc/**
coincide con todos los archivos dentro del directorioabc
, en relación con la ubicación del archivo.gitignore
, con profundidad infinita.Una barra seguida de dos asteriscos consecutivos y luego una barra coincide con cero o más directorios. Por ejemplo,
a/**/b
coincide cona/b
,a/x/b
,a/x/y/b
y así sucesivamente.Otros asteriscos consecutivos se consideran inválidos.