Список подкаталогов только n уровень глубокий

Фестиваль хранит данные голосовой почты в следующей примерной структуре каталогов:

/usr/share/festival/voices/<language>/<voicepack name>

Каков самый простой однострочный (желательно с использованием ls ), чтобы распечатывать только имя <voicepack name> во всех потенциально многочисленных подкаталогах <language> ?

2 Solutions collect form web for “Список подкаталогов только n уровень глубокий”

Я нахожусь на 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 

Подробная информация о поиске и basename

Эта команда работает, создавая список полных путей к файлам, которые имеют ровно 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 передать каждый двухуровневый каталог в команду basename . Обозначение basename {} – это то, что делает эти преобразования в базовом имени. Найти вызовы через его -exec переключатель.

Самый простой

 ls -d /usr/share/festival/voices/*/* 

Это расширяется оболочкой во все подкаталоги /usr/share/festival/voices/ а затем в содержимое каждого из этих подкаталогов.

Если вы хотите только спуститься до определенного уровня, как предполагает ваш заголовок, с некоторыми вариантами find такими как GNU и некоторые BSD:

 find /usr/share/festival/voices/ -mindepth 2 -maxdepth 3 -type d 

Это найдет все каталоги ( -type d ), которые находятся в подкаталоге /usr/share/festival/voices/ из-за mindepth 2 но не глубже, чем 3 уровня вниз ( maxdepth 3 ). От man find :

  -maxdepth levels Descend at most levels (a non-negative integer) levels of direc‐ tories below the command line arguments. -maxdepth 0 means only apply the tests and actions to the command line arguments. -mindepth levels Do not apply any tests or actions at levels less than levels (a non-negative integer). -mindepth 1 means process all files except the command line arguments. 
  • синтаксис ls -hide = и ls -ignore =
  • Как перечислить все файлы в каталоге с абсолютными путями
  • Как заказать несколько опций команды (ls)?
  • Преобразовать формат вывода ls -l в формат chmod
  • Можно ли изменить интервал между файлами с помощью ls
  • Найти файлы с 32 символами в рекурсивно в каталоге и применить команду
  • перечислить полный путь к файлу, не связывая его с относительным относительным путем
  • Как отличить вывод множества подобных команд
  • ls & dircolors - различать символическую ссылку на каталог и символическую ссылку на обычный файл
  • Как разрешить `ls` сначала отображать порядок результатов в строке?
  • Сортировка каталогов по последним измененным датам / времени файла с одинаковым именем
  • Linux и Unix - лучшая ОС в мире.