Ich bin auf Fedora und diese Voicepacks befinden sich an einem etwas anderen Ort:
$ ls /usr/share/festival/lib/voices/*/ -1 | grep -vE "/usr|^$"
kal_diphone
ked_diphone
nitech_us_awb_arctic_hts
nitech_us_bdl_arctic_hts
nitech_us_clb_arctic_hts
nitech_us_jmk_arctic_hts
nitech_us_rms_arctic_hts
nitech_us_slt_arctic_hts
Sie können dies einfach so ändern:
$ ls /usr/share/festival/voices/*/ -1 | grep -vE "/usr|^$"
Verwenden Sie find
Die Verwendung ls
in diesem Herrenhaus ist in der Regel verpönt, weil die Ausgabe von ls
schwer zu analysieren ist. Verwenden Sie den find
Befehl besser wie folgt:
$ find /usr/share/festival/lib/voices -maxdepth 2 -mindepth 2 \
-type d -exec basename {} \;
nitech_us_awb_arctic_hts
nitech_us_bdl_arctic_hts
nitech_us_slt_arctic_hts
nitech_us_jmk_arctic_hts
nitech_us_clb_arctic_hts
nitech_us_rms_arctic_hts
ked_diphone
kal_diphone
Details zu Fund & Basisname
Dieser Befehl erstellt eine Liste der vollständigen Pfade zu Dateien, die in Bezug auf dieses Verzeichnis genau zwei Ebenen tief sind:
/usr/share/festival/lib/voices
Diese Liste sieht folgendermaßen aus:
$ find /usr/share/festival/lib/voices -maxdepth 2 -mindepth 2
/usr/share/festival/lib/voices/us/nitech_us_awb_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_bdl_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_slt_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_jmk_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_clb_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_rms_arctic_hts
/usr/share/festival/lib/voices/english/ked_diphone
/usr/share/festival/lib/voices/english/kal_diphon
Wir wollen aber den letzten Teil dieser Verzeichnisse, den Blattknoten. So können wir es verwenden, um es basename
zu analysieren:
$ basename /usr/share/festival/lib/voices/us/nitech_us_awb_arctic_hts
nitech_us_awb_arctic_hts
Wenn Sie alles zusammenfassen, können Sie den find
Befehl veranlassen, dass jedes Verzeichnis mit einer Tiefe von 2 Ebenen an den basename
Befehl übergeben wird. Die Notation basename {}
ist, was diese Basisnamensumwandlungen tun. Find ruft es über den -exec
Schalter an.
-exec basename {}
du es denen erklären , die beim Herausfinden der Aufgaben in die Irre gehen ?find ~/ -maxdepth 1 -mindepth 1 -type d | xargs du -csh | sort -h
Findet die größten Verzeichnisse sortiert nach GrößeDas einfachste ist
Das wird von der Shell in alle Unterverzeichnisse von
/usr/share/festival/voices/
und dann in den Inhalt jedes dieser Unterverzeichnisse erweitert.Wenn Sie nur auf eine bestimmte Ebene herabsteigen möchten, wie Ihr Titel vorschlägt, mit einigen Implementierungen
find
wie GNUs und einigen BSDs:Das wird alle Verzeichnisse (finden
-type d
) , die in einem Unterverzeichnis sind/usr/share/festival/voices/
wegenmindepth 2
aber nicht tiefer als 3 Stufen nach unten (maxdepth 3
). Vonman find
:quelle
-type f
,-type d
um dies zu lösen, oder? Wartet auch auf die Antwort von-exec basename {}
-type d
findet Verzeichnisse. Dasbasename
ist eine sehr gute Idee, es wird nur der Name gedruckt und der Pfad entfernt. Angenommen, Sie möchten nur Namen, dann sollten Sie das tun. Schauen Sie sichman basename
und auch anman dirname
.Die akzeptierte Antwort funktioniert ordnungsgemäß, ist jedoch etwas ineffizient, da
basename
für jedes Unterverzeichnis ein neuer Prozess erstellt wird:Wenn möglich, ist es vorzuziehen, eingebaute Funktionen zu verwenden
find
, um die Kosten für Laichprozesse zu vermeiden.find
hat eine ziemlich umfangreiche Möglichkeit, die Druckausgabe mit der-printf
Aktion zu ändern . Die Standardaktion-print
druckt den gesamten Pfad, aber mit-printf
einer Formatzeichenfolge können Teile des Pfads zum Drucken ausgewählt werden. Um nur den Dateinamen des Pfads ohne die führenden Verzeichnisse zu extrahieren (wie es derbasename
Fall ist), lautet die Formatzeichenfolge%f
. Um nach jedem Dateinamen eine neue Zeile einzufügen, gehen Sie\n
wie folgt vor:quelle
find
mit beliebigen externen Befehlen ab. Es ist nur weniger effizient für Operationen, die eingebaut sindfind
. Ich hatte überlegt, seiner Antwort einen Kommentar hinzuzufügen, aber das erfordert mehr Ansehen als ich. Sie müssen Ihre akzeptierte Antwort nicht ändern, da die aktuell akzeptierte Antwort korrekt, gut erklärt und als Muster für den allgemeineren Fall verwendbar ist. Ich wollte nur darauf hinweisen, dass es für diesen speziellen Fall eine effizientere Methode gibt.TLDR; für diejenigen, die gerade hierher kommen, basierend auf dem Titel dieser Frage; zu "Unterverzeichnisse nur n Ebene tief auflisten": verwenden
Wo
N
ist eine Zahl?quelle