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

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

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

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

  • Как изменить цвет встроенного терминала в linux mint 12, чтобы иметь возможность использовать `ls` и` byobu`?
  • Сортировка списка файлов
  • Как я могу использовать подстановочные знаки с ls для поиска файлов, которые отсутствуют в числовой последовательности?
  • Что более эффективно, ls или ls -l?
  • Как я могу перечислить все файлы и символические ссылки в компактном представлении?
  • Есть ли какие-то подводные камни для переопределения ls?
  • Что означает @ перед именем каталога?
  • Разница между командой «ls -ltr abc *» и «find ./ -name abc *»?
  • 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. 
    Linux и Unix - лучшая ОС в мире.