Quiero actuar en una lista de subdirectorios en un directorio. Considerar:
for x in x86-headers/*/C/populate.sh; do echo $x; done
Esto da
x86-headers/elf/C/populate.sh
x86-headers/gl/C/populate.sh
x86-headers/gmp/C/populate.sh
x86-headers/gnome2/C/populate.sh
x86-headers/gtk2/C/populate.sh
x86-headers/jni/C/populate.sh
x86-headers/libc/C/populate.sh
Pero quiero valores que corresponde a la segunda parte de la ruta,
elf
, gl
, etc. Sé cómo quitarse el principal x86-headers
.
for x in x86-headers/*/C/populate.sh; do i=${x##x86-headers/}; echo $i; done
lo que da
elf/C/populate.sh
gl/C/populate.sh
gmp/C/populate.sh
gnome2/C/populate.sh
gtk2/C/populate.sh
jni/C/populate.sh
libc/C/populate.sh
También sé cómo quitar los términos posteriores en el camino. Es decir, bajando un nivel:
cd x86-headers
for x in */C/populate.sh; do i=${x%%/*}; echo $i; done
da
elf
gl
gmp
gnome2
gtk2
jni
libc
Pero, tratar de combinar estos no funciona. Es decir
for x in x86-headers/*/C/populate.sh; do i=${${x##x86-headers}%%/*}; echo $i; done
da
bash: ${${x##x86-headers}%%/*}: bad substitution
Sin duda, esta es una sintaxis incorrecta, pero no sé la sintaxis correcta. Por supuesto, podría haber mejores formas de hacer esto. Si usara Python, usaría dividir /
para dividir cada ruta en una lista y luego elegir el segundo elemento, pero no sé cómo hacerlo en bash.
EDITAR: Gracias por las respuestas. También debería haber preguntado, ¿es posible hacer esto de forma portátil, y si es así, cómo?
i=${x#*/}; i=${i%%/*}
es opcional, ¿verdad?