Ich möchte auf eine Liste von Unterverzeichnissen in einem Verzeichnis reagieren. Erwägen:
for x in x86-headers/*/C/populate.sh; do echo $x; done
Das gibt
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
Aber ich will Werte , dass entspricht dem zweiten Teil des Weges
elf
, gl
usw. Ich weiß , wie die führende abzustreifen x86-headers
.
for x in x86-headers/*/C/populate.sh; do i=${x##x86-headers/}; echo $i; done
was gibt
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
Ich weiß auch, wie ich spätere Begriffe auf dem Weg entfernen kann. Dh eine Ebene runter gehen:
cd x86-headers
for x in */C/populate.sh; do i=${x%%/*}; echo $i; done
gibt
elf
gl
gmp
gnome2
gtk2
jni
libc
Der Versuch, diese zu kombinieren, funktioniert jedoch nicht. Dh
for x in x86-headers/*/C/populate.sh; do i=${${x##x86-headers}%%/*}; echo $i; done
gibt
bash: ${${x##x86-headers}%%/*}: bad substitution
Zweifellos ist dies eine falsche Syntax, aber ich kenne die richtige Syntax nicht. Natürlich könnte es bessere Möglichkeiten geben, dies zu tun. Wenn ich Python verwenden würde, würde ich split on verwenden /
, um jeden Pfad in eine Liste zu unterteilen und dann das zweite Element auszuwählen, aber ich weiß nicht, wie ich das in bash machen soll.
EDIT: Danke für die Antworten. Ich hätte auch fragen sollen, ob es möglich ist, dies portabel zu machen, und wenn ja, wie?
i=${x#*/}; i=${i%%/*}
ist optional, oder?