Jestem na Fedorze, a te pakiety głosowe znajdują się w nieco innej lokalizacji:
$ 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
Możesz to zmodyfikować w następujący sposób:
$ ls /usr/share/festival/voices/*/ -1 | grep -vE "/usr|^$"
Używanie znajdź
Używanie ls
w tym dworze jest zwykle niezadowolone, ponieważ wynik ls
jest trudny do przeanalizowania. Lepiej użyć find
polecenia, tak:
$ 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
Szczegóły find & basename
To polecenie działa, tworząc listę pełnych ścieżek do plików o głębokości dokładnie 2 poziomów w odniesieniu do tego katalogu:
/usr/share/festival/lib/voices
Ta lista wygląda następująco:
$ 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
Ale chcemy ostatnią część tych katalogów, węzeł liścia. Możemy więc wykorzystać to basename
do przeanalizowania:
$ basename /usr/share/festival/lib/voices/us/nitech_us_awb_arctic_hts
nitech_us_awb_arctic_hts
Podsumowując, możemy sprawić, że find
polecenie przekaże każdemu głębokiemu katalogowi 2 poziomy do basename
polecenia. Notacja basename {}
jest tym, co robi te konwersje basename. Znajdź połączenia za pomocą -exec
przełącznika.
-exec basename {}
Czy możesz wyjaśnić tym, którzy wpadają w potrzaski, gdy zastanawiają się, co to robi?find ~/ -maxdepth 1 -mindepth 1 -type d | xargs du -csh | sort -h
Znajduje największe katalogi posortowane według wielkościNajłatwiej jest
To jest rozszerzane przez powłokę do wszystkich podkatalogów,
/usr/share/festival/voices/
a następnie do zawartości każdego z tych podkatalogów.Jeśli chcesz schodzić tylko do określonego poziomu, jak sugeruje Twój tytuł, z pewnymi implementacjami,
find
takimi jak GNU i niektóre BSD:To znajdzie wszystkie katalogi (
-type d
), które znajdują się w podkatalogu z/usr/share/festival/voices/
powodu,mindepth 2
ale nie głębszego niż 3 poziomy w dół (maxdepth 3
). Odman find
:źródło
-type f
aby-type d
rozwiązać ten problem, prawda?-exec basename {}
-type d
znajdzie katalogi.basename
To bardzo dobry pomysł, będzie drukować tylko nazwę i usunąć ścieżkę. Zakładając, że chcesz tylko imion, powinieneś to zrobić. Zobaczman basename
takżeman dirname
.Akceptowane odpowiedź działa poprawnie, ale jest nieco nieefektywne, ponieważ ikra nowy
basename
proces dla każdego podkatalogu:Jeśli to możliwe, lepiej jest korzystać z wbudowanych funkcji,
find
aby uniknąć kosztów procesów odradzania.find
ma dość szerokie możliwości modyfikowania wydruków za pomocą-printf
akcji. Domyślna-print
akcja drukuje całą ścieżkę, ale przy użyciu-printf
i ciągu formatującego można wybrać fragmenty ścieżki do wydrukowania. Aby wyodrębnić tylko część nazwy pliku ścieżki bez wiodących katalogów (jak tobasename
robi), ciąg formatu to%f
. Aby wstawić znak nowej linii po każdej nazwie pliku, wykonaj\n
następujące czynności:źródło
find
z dowolnych poleceń zewnętrznych; jest po prostu mniej wydajny w przypadku wbudowanych operacjifind
. Zastanawiałem się nad dodaniem komentarza do jego odpowiedzi, ale to wymaga więcej reputacji niż ja. Nie ma potrzeby zmiany przyjętej odpowiedzi, ponieważ obecnie akceptowana odpowiedź jest poprawna, dobrze wyjaśniona i użyteczna jako wzorzec dla bardziej ogólnego przypadku; Chciałem tylko zaznaczyć, że w tym konkretnym przypadku istnieje bardziej skuteczna metoda.TLDR; dla tych, którzy dopiero przybywają tutaj na podstawie tytułu tego pytania; na „Lista podkatalogów tylko na głębokość n”: użyj
gdzie
N
jest dowolna liczba.źródło