Команда ls в Linux используется для вывода содержимого любого каталога.
По умолчанию в нем отображается все содержимое, будь то файл, каталог, ссылка или именованный канал.
Но что, если вы хотите перечислить только каталоги?
Как и все в Linux, есть несколько способов выполнить одну и ту же задачу. Список только каталогов ничем не отличается:
Всегда полезно делать это с помощью знакомой команды ls, потому что это команда, которую вы используете для отображения содержимого каталога.
Чтобы вывести список только подкаталогов , используйте параметр -d с командой ls следующим образом:
ls -d */
Вот результат, который он показывает:
[destroyer@andreyex]$ ls -d */ another_dir/ my_dir/
Почему */? Потому что без него ls -d будет возвращено только имя каталога. В списке опции -d каталоги не его содержимое (который включает в себя файл, каталоги и т.д.).
Это */ – шаблон. С помощью * вы перечисляете все содержимое (включая содержимое подкаталогов), а шаблон / ограничивает каталоги.
Вы можете комбинировать его с опцией длинного листинга -l и большинством других опций:
[destroyer@andreyex]$ ls -ld */ drwxrwxr-x. 1 destroyer destroyer 16 Nov 7 18:22 another_dir/ drwxrwxr-x. 1 destroyer destroyer 44 Nov 7 18:22 my_dir/
Если вам не нужна завершающая косая черта (/) в конце имен каталогов, вы можете использовать команду cut, чтобы вырезать ее:
[destroyer@andreyex]$ ls -ld */ | cut -f1 -d'/' drwxrwxr-x. 1 destroyer destroyer 16 Nov 7 18:22 another_dir drwxrwxr-x. 1 destroyer destroyer 44 Nov 7 18:22 my_dir
Вышеупомянутая команда работает в текущем каталоге. Что делать, если вы не в том же каталоге?
В этой ситуации вы можете использовать */в конце пути к каталогу ls -d:
ls -d Path/To/Dir/*/
Вот пример, когда мы выходим из каталога Documents и затем перечисляю только каталоги внутри каталога Documents:
[destroyer@localhost ~]$ ls -ld Documents/*/ drwxrwxr-x. 1 destroyer destroyer 16 Nov 7 18:22 Documents/another_dir/ drwxrwxr-x. 1 destroyer destroyer 44 Nov 7 18:22 Documents/my_dir/
Вы заметили, что в нем нет скрытого каталога? Это один из недостатков этого метода. Вы можете использовать ls -d .*/ для отображения скрытых каталогов, но он отображает только скрытые каталоги.
Вы всегда можете положиться на старую-добрую команду grep для фильтрации вывода для определенного контента.
Если вы долго перечисляете содержимое, вы можете идентифицировать каталоги, потому что начните с d.
Вы можете использовать grep для фильтрации содержимого, которое начинается с d:
ls -l | grep '^d'
Но это дает вам гораздо больше полей, чем просто имена каталогов:
[destroyer@andreyex]$ ls -l | grep '^d' drwxrwxr-x. 1 destroyer destroyer 16 Nov 8 11:46 another_dir drwxrwxr-x. 1 destroyer destroyer 44 Nov 8 11:46 my_dir
Вот как использовать команду find для вывода списка только подкаталогов:
find directory_path -maxdepth 1 -type d
Надеюсь, вы знакомы с командой find. Тем не менее мы объясним.
С помощью type d вы просите команду find искать только каталоги.
С помощью maxdepth 1 вы просите команду find сохранить поиск только на текущем уровне (и не заходить в подкаталоги).
[destroyer@andreyex]$ find . -maxdepth 1 -type d . ./my_dir ./another_dir ./.my_hidden_dir
Как вы можете видеть в выводе выше, он также показывает скрытый каталог.
Если ваша цель – перечислить только каталоги, вы также можете использовать команду tree.
По умолчанию команда tree дает вам полную структуру каталогов. Вы можете изменить его, чтобы отображались только каталоги и только на текущем уровне.
tree -dai -L 1
Вот результат:
destroyer@andreyex]$ tree -dai -L 1 . another_dir my_dir .my_hidden_dir 3 directories
Маловероятный кандидат? Вы будете удивлены, узнав, что команда echo в Linux также может использоваться для отображения содержимого каталога. Попробуйте использовать echo * и убедитесь сами.
Подобно команде ls, вы также можете использовать шаблон */ для вывода списка только каталогов в текущем рабочем каталоге.
echo */
Вот результат, идентичный тому, что вы получили с помощью команды ls -d.
Могло быть больше способов перечислить только каталоги, а не файлы. Фактически, обсуждаемые здесь методы могут иметь некоторые «если» и «но» в зависимости от того, что вы ищете.
Если ваша цель – просто отобразить каталоги, большинство команд, которые я обсуждал, будут работать. Если вам нужно что-то более конкретное, например, получить имя каталога только с косой чертой и т. д., Вам придется выполнить некоторое форматирование самостоятельно.
Надеюсь, этот совет по Linux окажется для вас полезным. Вопросы и предложения всегда приветствуются.