Tengo esta estructura de directorio:
~/tmp/globstar ɀ find dir -type f dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext
y, con el globstar
opción habilitada en Bash, puedo decir:
~/tmp/globstar ɀ ls -1 dir/**/*.ext dir/subdir1/file.ext dir/subdir2/file.ext
Mi pregunta es: ¿por qué dir/file.ext
excluido de esta lista?
Bash manual dice esto sobre globstar
:
Si se establece, el patrón ** usado en un contexto de expansión de nombre de archivo coincidirá con todos los archivos y con cero o más directorios y subdirectorios. Si el patrón va seguido de un /, solo los directorios y subdirectorios coinciden.
“ cero ”en este párrafo déjame tener la impresión de que se debería haber incluido dir/file.ext
; a menos que me falte algo.
Comentarios
Respuesta
Supongo que se refiere solo al nivel de subdirectorio . **
sin /
coincide
-
todos los archivos y directorios
-
cero o más subdirectorios
Pero no desaparece por completo. **/
significa que ningún archivo en el directorio de nivel más alto al que se aplica **
se corresponde.
Necesita dir/*.ext dir/**/*.ext
.
Comentarios
- Sí, esa es exactamente mi alternativa, simplemente no se ve bonita. 😉
Respuesta
Esto funciona como esperabas en estas versiones de Bash que se suministran con las distribuciones enumeradas :
- 4.1.2 (1) – CentOS 6.5
- 4.1.5 (1) – Debian 6.0.10
- 4.1.10 (4 ) – Cygwin 1.7.31
- 4.2.46 (1) – CentOS 7.1
- 4.3.11 (1) – Ubuntu 14.04.1
- 4.3.30 (1) – Debian 8.1
De hecho, las versiones enumeradas anteriormente son todas las que probé. En otras palabras, no encontré una versión 4 de Bash donde no funciona. La opción globstar
se agregó en Bash 4.0; consulte CAMBIOS . En versiones anteriores, el comando shopt -s globstar
debería devolver un error.
Pruebas
1 . dir/**/*.ext
coincide con dir/file.ext
:
~/tests$ ls -1 dir/**/*.ext dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext
2. **/*.ext
coincide con file.ext
:
~/tests$ cd dir ~/tests/dir$ ls -1 **/*.ext file.ext subdir1/file.ext subdir2/file.ext
Preparación del entorno para reproducir las pruebas anteriores:
mkdir -p dir/subdir{1,2} touch dir/{,subdir{1,2}/}file.ext shopt -s globstar
Comentarios
- este es el respuesta correcta. El OP olvidó configurar
shopt -s globstar
.
Responder
I me parece que has desactivado globstar. Se puede activar así:
shopt -s globstar
No solo no coincidirá con cero subdirectorios, sino que tampoco coincidirá con dos subdirectorios:
$ find dir -type f #the same as yours except with a directory inside one of the subdirectories dir/file.ext dir/subdir1/file.ext dir/subdir1/subsubdir/file.ext dir/subdir2/file.ext $ shopt -u globstar #turn globstar off $ #will only show files in subdirectories $ #will not show files in dir or in subsubdir $ echo dir/**/*.ext dir/subdir1/file.ext dir/subdir2/file.ext $ shopt -s globstar #turn globstar on $ #will show all four files $ echo dir/**/*.ext dir/file.ext dir/subdir1/file.ext dir/subdir1/subsubdir/file.ext dir/subdir2/file.ext
Con globstar desactivado, ** termina comportándose como *, por lo que dir/**/*.ext
obtiene el mismo resultado que dir/*/*.ext
$ echo dir/*/*.ext dir/subdir1/file.ext dir/subdir2/file.ext
que a veces me engaña haciéndome pensar que globstar está activado
comprueba tu configuración actual de globstar como esto:
shopt | grep globstar
Comentarios
- Puede verificar la configuración de una opción de shell directamente, como en
shopt globstar
.
ɀ
?unicode ɀ
o Wikipediaɀ
es solo un carácter que se usa aquí para distinguir el indicador. Algunos usuarios prefieren el carácter£
o€
en lugar de$
:). Originalmente,ɀ
un carácter ' z ' creado para una notación de idioma africano especial: – )