Я на Fedora, и эти голосовые пакеты находятся в немного другом месте:
$ 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
Вы можете просто изменить это так:
$ ls /usr/share/festival/voices/*/ -1 | grep -vE "/usr|^$"
Используя find
Использование ls
в этом поместье, как правило, неодобрительно, потому что вывод ls
трудно анализировать. Лучше использовать find
команду, например так:
$ 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
Детали поиска и базовое имя
Эта команда работает путем создания списка полных путей к файлам, которые имеют ровно 2 уровня по отношению к этому каталогу:
/usr/share/festival/lib/voices
Этот список выглядит так:
$ 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
Но нам нужна последняя часть этих каталогов, конечный узел. Таким образом, мы можем использовать его basename
для анализа:
$ basename /usr/share/festival/lib/voices/us/nitech_us_awb_arctic_hts
nitech_us_awb_arctic_hts
Собрав все это вместе, мы можем заставить find
команду передавать каждый 2-х уровневый каталог в basename
команду. Обозначение basename {}
- то, что делает эти преобразования базового имени. Найти звонки через -exec
переключатель.
-exec basename {}
могли бы вы объяснить для тех, кто запутался, когда выяснял, что это значит?find ~/ -maxdepth 1 -mindepth 1 -type d | xargs du -csh | sort -h
находит самые большие каталоги, отсортированные по размеруСамый простой
Это расширяется оболочкой во все подкаталоги,
/usr/share/festival/voices/
а затем в содержимое каждого из этих подкаталогов.Если вы хотите опускаться только до определенного уровня, как подсказывает ваш заголовок, с некоторыми реализациями,
find
такими как GNU и некоторые BSD:Это найдет все каталоги (
-type d
), которые находятся в подкаталоге/usr/share/festival/voices/
из-за,mindepth 2
но не глубже 3-х уровней down (maxdepth 3
). Отman find
:источник
-type f
на-type d
должно решить эту проблему, верно? Также будет ждать ответа-exec basename {}
-type d
найдет каталоги. Этоbasename
очень хорошая идея, она напечатает только имя и удалит путь. Предполагая, что вы хотите только имена, это то, что вы должны делать. Посмотритеman basename
такжеman dirname
.Общепринятый ответ работает правильно , но несколько неэффективно , поскольку он порождает новый
basename
процесс для каждого подкаталога:По возможности предпочтительно использовать встроенные функции,
find
чтобы избежать затрат на процессы нереста.find
имеет довольно обширную возможность изменять вывод на печать с помощью-printf
действия. Действие по умолчанию-print
печатает весь путь, но с-printf
помощью строки форматирования можно выбрать части пути для печати. Чтобы извлечь только часть пути к файлу без ведущих каталогов (как этоbasename
делается), строка формата имеет вид%f
. Чтобы разместить новую строку после каждого имени файла, включите\n
следующее:источник
find
произвольных внешних команд; он просто менее эффективен для встроенных операцийfind
. Я подумывал добавить комментарий к его ответу, но это требует больше репутации, чем у меня. Нет необходимости менять принятый ответ, поскольку принятый в настоящее время ответ является правильным, хорошо объясненным и может использоваться в качестве шаблона для более общего случая; Я просто хотел указать, что для этого конкретного случая есть более эффективный метод.TLDR; для тех, кто только приезжает сюда на основании названия этого вопроса; «Вывести список подкаталогов только на глубину n»: используйте
где
N
любое числоисточник