2016-12-09 10 views
0

Ich versuche, alle Dateien in bestimmten Unterverzeichnissen eines Verzeichnisses in meinem Bash-Skript aufzulisten. Hier ist was ich versucht habe.Erweitern Sie einen Teil des Pfades in Bash-Skript

root_dir="/home/shaf/data/" 
sub_dirs_prefixes=('ab' 'bp' 'cd' 'cn' 'll' 'mr' 'mb' 'nb' 'nh' 'nw' 'oh' 'st' 'wh') 

ls "$root_dir"{$(IFS=,; echo "${sub_dirs_prefixes[*]}")}"rrc/" 

Bitte beachten Sie, dass ich will nicht Wert in $root_dir gespeichert erweitern, wie es Leerzeichen enthalten kann, aber ich will Unterpfad in {enthalten erweitern}, die eine durch Kommata getrennte Zeichenfolge von Inhalten $sub_dirs_prefixes ist. Ich habe Unterverzeichnisse Präfixe in einer Array-Variablen, $sub_dirs_prefixes, gespeichert, weil ich sie später für etwas anderes verwenden muss.

ich folgende Fehler bekommen:

ls: cannot access /home/shaf/data/{ab,bp,cd,cn,ll,mr,mb,nb,nh,nw,oh,st,wh}rrc/ 

Wenn ich den Pfad in Fehlermeldung kopieren und ls von der Kommandozeile ausführen, es tut Anzeigeinhalt von börsennotierten Unterverzeichnissen.

+1

Die Klammererweiterung erfolgt vor der Variablenerweiterung, dies ist also nicht in einem Durchgang möglich. Sie könnten mit all den Auswirkungen auf die Sicherheit und Zuverlässigkeit, die es gibt, "überprüfen", aber es wäre besser, wenn Sie eine Schleifen- oder Array-Ersetzung verwenden würden. –

Antwort

1

Sie können die Substitution dazu verwenden, ein erweitertes Muster zu generieren.

shopt -s extglob 
ls "$root_dir"/$(IFS="|"; echo "@(${sub_dirs_prefixes[*]})rrc") 

Als Parameter kann Befehlsersetzungen abgeschlossen, sieht die Shell diese kurz vor Pfadname Expansion durchführen:

ls "/home/shaf/data/"/@(ab|bp|cd|cn|ll|mr|mb|nb|nh|nw|oh|st|wh)rrc 

Das @(...) Muster entspricht einer der eingeschlossenen Präfixe.

Es wird etwas komplizierter, wenn die Komponenten der Verzeichnisnamen Zeichen enthalten, die in Anführungszeichen gesetzt werden müssen, da wir nicht die Befehlssubstitution angeben.

+0

Danke für die Antwort. Kannst du bitte etwas erklären, wie 'extglob' funktioniert, damit ich deine Antwort annehmen kann? Vielleicht möchten Sie auch '/' vor '@' entfernen. Du sagtest '@' stimmt mit einem der eingeschlossenen Präfixe überein, obwohl es mit jedem übereinstimmt, wenn ich das korrekte Ergebnis versuche und zurückgebe. – shaffooo

Verwandte Themen