Je veux agir sur une liste de sous-répertoires dans un répertoire. Considérer:
for x in x86-headers/*/C/populate.sh; do echo $x; done
Cela donne
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
Mais je veux des valeurs qui correspond à la seconde partie du chemin,
elf
, gl
, etc. Je sais comment Supprimer le caractère x86-headers
.
for x in x86-headers/*/C/populate.sh; do i=${x##x86-headers/}; echo $i; done
qui donne
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
Je sais également comment supprimer les termes ultérieurs du chemin. C'est à dire en descendant d'un niveau:
cd x86-headers
for x in */C/populate.sh; do i=${x%%/*}; echo $i; done
donne
elf
gl
gmp
gnome2
gtk2
jni
libc
Mais essayer de les combiner ne fonctionne pas. C'est à dire
for x in x86-headers/*/C/populate.sh; do i=${${x##x86-headers}%%/*}; echo $i; done
donne
bash: ${${x##x86-headers}%%/*}: bad substitution
C'est sans doute une syntaxe incorrecte, mais je ne connais pas la syntaxe correcte. Bien sûr, il pourrait y avoir de meilleures façons de le faire. Si j'utilisais Python, j'utiliserais split on /
pour décomposer chaque chemin en une liste, puis choisir le deuxième élément, mais je ne sais pas comment faire cela en bash.
EDIT: Merci pour les réponses. J'aurais également dû demander, est-il possible de le faire de manière portable et si oui, comment?
i=${x#*/}; i=${i%%/*}
est facultatif, non?