¿Qué es el ** carácter glob?

84

Tengo este camino en mi react gulpfile:

var path = {
  HTML: 'src/index.html',
  ALL: ['src/js/*.js', 'src/js/**/*.js', 'src/index.html'],
  JS: ['src/js/*.js', 'src/js/**/*.js'],
  MINIFIED_OUT: 'build.min.js',
  DEST_SRC: 'dist/src',
  DEST_BUILD: 'dist/build',
  DEST: 'dist'
};

¿Qué es el carácter doble glob?

Sé lo que es el globo único ... pero ¿qué es el doble? solo glob

Jwan622
fuente

Respuestas:

98

Es casi lo mismo que el asterisco único, pero puede constar de varios niveles de directorio.

En otras palabras, while /x/*/ycoincidirá con entradas como:

/x/a/y
/x/b/y

y así sucesivamente (con sólo un nivel de directorio en la sección de comodín), el doble asterisco /x/**/yserá también coincidir con cosas como:

/x/any/number/of/levels/y

con el concepto de "cualquier número de niveles" que también incluye cero (en otras palabras, /x/**/ycoincidirá /x/ycomo una de sus opciones).


Aparte, por mucho que odio darle crédito al mainframe con algo, creo que esto se ha utilizado desde los días de la lista preliminar de MVS para permitir la selección de conjuntos de datos en múltiples niveles :-)

paxdiablo
fuente
2
Esto no tiene sentido. Si * denota 0 o más caracteres, entonces ese patrón podría coincidir potencialmente con / x // y, lo cual no tiene sentido. Lo que realmente está diciendo es "cualquier número de caracteres, seguido de cualquier número de caracteres". ¿No es eso solo ... oh, no sé ... cualquier número de caracteres ???
AleksandrH
6
@AleksandrH, no, esto no es una expresión regular en el sentido normal: no hay coincidencia de caracteres, solo nombres de directorio. Esto es específicamente para sistemas de archivos jerárquicos. En su primer punto, si se permitieran nombres de directorio vacíos, /x//ysería perfectamente válido. Sin embargo, nunca he visto un sistema de archivos que permita esto. En el segundo punto, los *medios coinciden con "cualquier nombre de directorio, solo un nivel" (por lo que no irán más allá del siguiente /divisor), mientras que los **medios "coinciden con cualquier número de niveles con cualquier nombre de directorio en cada nivel" (pueden cruzar tantos /divisores según sea necesario).
paxdiablo
9
Vale la pena señalar que, para /x/**/y/, /x/y/también se incluye, que está ordenada.
Yassine Imounachen
24

Por lo general, se usa para indicar cualquier número de subdirectorios. Entonces

src/js/**/*.js

Coincidiría

src/js/files/*.js
src/js/more-files/*.js

etc
etc
Sean
fuente
8
Un solo asterisco también coincidiría con sus ejemplos. Creo que pretendía incluir un subdirectorio adicional a su segundo ejemplo.
Simon East
1
¿@SimonEast le gusta esto? src / js / files / controllers / user.js, src / js / files / models / foo / var.js
AutumnSky
eh, no el más claro
Jwan622
20

**coincide con cualquier carácter, incluida una barra inclinada, /
*coincide con cualquier carácter excepto con una barra inclinada (para que coincida solo con el nombre del archivo o directorio)

Thomas S.
fuente