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

  • ¿Qué es este personaje? ɀ?
  • ¿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 ¿Es un mensaje?
  • slm, ¡sí! ɀ 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: – )
  • " GNU bash, versión 3.2.53 (1) -release (x86_64-apple-darwin13) " enviado con OS X 10.9 tiene este comportamiento.

Respuesta

Supongo que se refiere solo al nivel de subdirectorio . ** sin / coincide

  1. todos los archivos y directorios

  2. 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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *