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

Да, не используйте который:

  • В некоторых системах это - внешняя команда, реализованная как csh сценарий, который может прочитать конфигурацию, которая изменяется PATH.
  • Существует встроенное для этого. Два, даже: type и command. POSIX путь:

    command -v emacs       # machine-readable format
    type emacs             # human-only format
    

    В ударе можно также использовать type -p emacs видеть просто путь внешней команды.

Однако здесь, which является на самом деле правильным. Bash хранит информацию о местоположении команды в памяти, так, чтобы это могло выполнить команду быстрее в следующий раз. Вы установили новое emacs исполняемый файл на Вашем PATH, но удар все еще имеет старое расположение в своем кэше. Выполненный hash emacs искать emacs снова, или hash -r освободить кэш.

62
02.10.2013, 21:20
3 ответа

Я нахожусь на Fedora, и эти voicepacks находятся в немного отличающемся месте:

$ 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|^$"

Используя находку

Используя 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 переключатель.

84
27.01.2020, 19:32
  • 1
    lol, в значительной степени точно тот же ответ, великие умы и все это :). –  terdon♦ 02.10.2013, 21:43
  • 2
    +1 - Для тех, кто сбит с толку при выяснении что -exec basename {} Вы могли объяснить здесь? –  user66001 02.10.2013, 22:03
  • 3
    @user66001 сервера - объясняет ли это это достаточно. –  slm♦ 02.10.2013, 22:20
  • 4
    @user66001 - можно принять один из ответов, если он решает проблему к satisfication 8-) –  slm♦ 02.10.2013, 22:32
  • 5
    Команда находки - то, что мне нужны 99% времени. Предел и макс. и минута был ключевым - я только сделал максимум Пример: find ~/ -maxdepth 1 -mindepth 1 -type d | xargs du -csh | sort -h Находит самые большие каталоги отсортированными на размере –  oligofren 25.04.2018, 11:23

Самое легкое

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

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

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

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.
27
27.01.2020, 19:32
  • 1
    Да это похоже на взгляд в зеркальном 8-) –  slm♦ 02.10.2013, 21:44
  • 2
    +1, Как вы оба получили 2 голоса, интересен. Голосование против своей партии объясняет 1 каждый ;) P.S. я хотел имена каталогов, поэтому просто изменившись -type f кому: -type d должен решить это, правильно? Будет также ожидать на ответе slm относительно цели -exec basename {} –  user66001 02.10.2013, 22:04
  • 3
    @user66001 да, -type d найдет каталоги. basename очень хорошая идея, она распечатает только имя и удалит путь. Принятие Вас только хочет имена, это - то, что необходимо сделать. Взгляните на man basename и также man dirname. –  terdon♦ 02.10.2013, 22:08
  • 4
    Спасибо terdon - Извините за не маркировку Вашего как ответ. Чувствовавший, что текущая версия slm's имеет больше информации для тех, которым нужен он. –  user66001 02.10.2013, 22:57
  • 5
    @user66001, в первую очередь, Вы абсолютно правы, slm's действительно лучше. Второй Вы никогда не должны приносить извинения за то, что не приняли, может быть только один, и это должно быть тем, которое Вы рассматриваете лучше всего :). –  terdon♦ 03.10.2013, 00:07

TLDR; для тех, кто только что пришел сюда на основании заголовка этого вопроса; для «Список подкаталогов только на уровне n [s] в глубину» :используйте

find -maxdepth N

где N— любое число.


Пример:

find -maxdepth 4

для 4-уровневого списка всех файлов и папок.


А если вам нужно найти определенный файл или папку, просто направьте его на grep. Бывший:

find -maxdepth 4 | grep -i some_file_name

Обратите внимание, что -iвыше делает поиск grep имен файлов и папок, вытекающих из команды find, регистр 'i'нечувствительный.

6
27.01.2020, 19:32

Теги

Похожие вопросы