bash globstar a juego

17

Tengo esta estructura de directorio:

~/tmp/globstar ɀ  find dir -type f
dir/file.ext
dir/subdir1/file.ext
dir/subdir2/file.ext

y, con la globstaropció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é está dir/file.extexcluido de esta lista?

El manual de Bash dice esto sobre globstar:

Si se establece, el patrón '**' utilizado en un contexto de expansión de nombre de archivo coincidirá con todos los archivos y cero o más directorios y subdirectorios. Si el patrón es seguido por un '/', solo coinciden los directorios y subdirectorios.

" Cero " en este párrafo me deja con la impresión de que dir/file.extdebería haberse incluido; a menos que espero que me falte algo.

Vlad GURDIGA
fuente
2
¿Qué es este personaje? ɀ?
slm
2
¿Qué versión de bash, en qué plataforma? No puedo reproducir esto con bash 4.2.37 en Debian wheezy o bash 4.1.5 en Debian squeeze. @slm unicode ɀo Wikipedia
Gilles 'SO- deja de ser malvado'
1
@Gilles ¿Es eso un aviso?
slm
55
slm, sí! ɀes solo un carácter utilizado aquí para distinguir prompt. Algunos usuarios prefieren el personaje £o en lugar de $:). Originalmente, ɀun carácter 'z' creado para una notación especial de idioma africano :-)
Slyx
1
"GNU bash, versión 3.2.53 (1) -release (x86_64-apple-darwin13)" enviado con OS X 10.9 tiene este comportamiento.
natevw

Respuestas:

8

Supongo que eso se refiere solo al nivel del subdirectorio. **sin /fósforos

  1. todos los archivos y directorios

  2. cero o más subdirectorios

Pero no desaparece por completo. **/significa que no hay archivos en el directorio de nivel más alto que **correspondan.

Es necesario dir/*.ext dir/**/*.ext.

Hauke ​​Laging
fuente
Sí, esa es exactamente mi alternativa, simplemente no se ve bonita. ;-)
Vlad GURDIGA
9

Esto funciona como esperaba en estas versiones de Bash que se proporcionan 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 todo lo que probé. En otras palabras, no encontré una versión 4 de Bash donde no funciona. La opción globstarse agregó en Bash 4.0 ver CAMBIOS . En versiones anteriores, el comando shopt -s globstardebería devolver un error.

Pruebas

1. dir/**/*.ext coincidencias dir/file.ext:

~/tests$ ls -1 dir/**/*.ext
dir/file.ext
dir/subdir1/file.ext
dir/subdir2/file.ext

2. **/*.ext partidos 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
pabouk
fuente
1
Esta es la respuesta correcta. El OP olvidó configurar shopt -s globstar.
CS Pei
4

Me mira como si tuvieras / tuvieras globstar apagado. 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 apagado, ** termina comportándose como *, por lo que dir/**/*.extobtiene el mismo resultado quedir/*/*.ext

$ echo dir/*/*.ext
dir/subdir1/file.ext dir/subdir2/file.ext

lo que a veces me hace pensar que Globstar está encendido

compruebe su configuración actual de globstar de esta manera:

shopt | grep globstar
Alex028502
fuente
1
Puede verificar una configuración de opción de shell directamente, como en shopt globstar.
Benjamin W.