22 ответов:
*/- это шаблон, который соответствует всем подкаталогам в текущем каталоге (*будет соответствовать все файлы и подкаталоги; the/ограничивает его в каталогах). Аналогично, чтобы перечислить все подкаталоги в разделе/home/alice / Documents, используйтеls -d /home/alice/Documents/*/
четыре способа сделать это, каждый с другим форматом вывода
1. Используя
echoпример:
echo */,echo */*/
Вот что я получил:cs/ draft/ files/ hacks/ masters/ static/ cs/code/ files/images/ static/images/ static/stylesheets/2. Используя
lsтолькопример:
ls -d */
Вот именно то, что я получил:cs/ files/ masters/ draft/ hacks/ static/или список (с подробной информацией):
ls -dl */3. Используя
lsиgrepпример:
ls -l | grep "^d"Вот что я получил:drwxr-xr-x 24 h staff 816 Jun 8 10:55 cs drwxr-xr-x 6 h staff 204 Jun 8 10:55 draft drwxr-xr-x 9 h staff 306 Jun 8 10:55 files drwxr-xr-x 2 h staff 68 Jun 9 13:19 hacks drwxr-xr-x 6 h staff 204 Jun 8 10:55 masters drwxr-xr-x 4 h staff 136 Jun 8 10:55 static4. Сценарий Bash (не рекомендуется для имени файла содержать пробел.)
пример:
for i in $(ls -d */); do echo ${i%%/}; done
Вот что я получил:cs draft files hacks masters staticесли вы хотите иметь '/' в качестве конечного символа, команда будет:
for i in $(ls -d */); do echo ${i}; donecs/ draft/ files/ hacks/ masters/ static/
Я использую:
ls -d */ | cut -f1 -d'/'это создает один столбец без конечной косой черты-полезно в скриптах.
мои два цента.
все папки без подпапки:
find /home/alice/Documents -maxdepth 1 -type dвсе папки С подпапки:
find /home/alice/Documents -type d
4 (больше) надежных варианта.
An без кавычек звездочка
*будет интерпретироваться как шаблон (glob) оболочкой.
оболочка будет использовать его в расширении пути.
он будет генерировать список имен файлов, которые соответствуют шаблону.
простая звездочка будет соответствовать всем именам файлов в PWD (настоящий рабочий каталог).
более сложная картина, как*/будет соответствовать все имена, которые заканчиваются на/.
таким образом, все справочники. Вот почему команда:1.- эхо.
echo */ echo ./*/ ### avoid misinterpreting filenames like "-e dir"будет расширен (оболочкой) до
echoвсе каталоги в PWD.
чтобы проверить это: создайте каталог (
mkdir) названный как test-dir, иcdв:mkdir test-dir; cd test-dirсоздать несколько каталогов:
mkdir {cs,files,masters,draft,static} # safe directories. mkdir {*,-,--,-v\ var,-h,-n,dir\ with\ spaces} # some a bit less secure. touch -- 'file with spaces' '-a' '-l' 'filename' # and some files:
команда
echo ./*/останется надежным даже с нечетными именованными файлами:./--/ ./-/ ./*/ ./cs/ ./dir with spaces/ ./draft/ ./files/ ./-h/ ./masters/ ./-n/ ./static/ ./-v var/но пробелы в именах файлов делают чтение немного запутанным.
если вместо
echo, мы используемls, оболочка по-прежнему, что расширяет список имен файлов. Оболочка является причиной для получения списка каталогов в PWD. Элемент доlsделает его список текущей записи каталога вместо содержимого каждого каталога (как представлено по умолчанию).ls -d */однако, эта команда (несколько) менее надежны. Он потерпит неудачу с нечетным именованные файлы, перечисленные выше. Он задохнется от нескольких имен. Вам нужно стереть один за другим, пока вы не найдете те, с проблемами.
2.- ls
GNU
lsпримет "конец настройки" (--ключ).ls -d ./*/ ### more reliable BSD ls ls -d -- */ ### more reliable GNU ls3.-е
чтобы перечислить каждый каталог в отдельной строке (в одном столбце, аналогично ls -1), используйте:
$ printf "%s\n" */ ### Correct even with "-", spaces or newlines.и, еще лучше, мы могли бы удалить трейлинг
/:$ set -- */; printf "%s\n" "${@%/}" ### Correct with spaces and newlines.An попытка такая:
$ for i in $(ls -d */); do echo ${i%%/}; doneне получится:
- некоторые имена (
ls -d */) как уже было показано выше.- будет зависеть от значения
IFS.- разделит имена на пробелы и вкладки (по умолчанию
IFS).- каждая новая строка в имени будет запускать новую команду echo.
4.- Функция
наконец, использование списка аргументов внутри функции не повлияет на аргументы список текущей запущенной оболочки. Просто:
$ listdirs(){ set -- */; printf "%s\n" "${@%/}"; } $ listdirsпредставляет этот список:
-- - * cs dir with spaces draft files -h masters -n static -v varэти параметры безопасны с несколькими типами нечетных имен файлов.
The
treeкоманда также очень полезна здесь. По умолчанию он будет показывать все файлы и каталоги на полную глубину, с некоторыми символами ASCII показывает дерево каталогов.$ tree . ├── config.dat ├── data │ ├── data1.bin │ ├── data2.inf │ └── sql | │ └── data3.sql ├── images │ ├── background.jpg │ ├── icon.gif │ └── logo.jpg ├── program.exe └── readme.txtно если бы мы хотели получить только каталоги, без дерева ascii, и с полным путем из текущего каталога, вы могли бы сделать:
$ tree -dfi . ./data ./data/sql ./imagesдоводы являются:
-d List directories only. -f Prints the full path prefix for each file. -i Makes tree not print the indentation lines, useful when used in conjunction with the -f option.и если вам нужен абсолютный путь, вы можете начать с указания полный путь к текущему каталогу:
$ tree -dfi "$(pwd)" /home/alice/Documents /home/alice/Documents/data /home/alice/Documents/data/sql /home/alice/Documents/imagesи ограничить количество подкаталогов, вы можете установить максимальный уровень подкаталогов с
-L level, например:$ tree -dfi -L 1 "$(pwd)" /home/alice/Documents /home/alice/Documents/data /home/alice/Documents/imagesбольше аргументов можно увидеть с человек-дерево
Если вам интересно, почему вывод из ' ls-d */' дает вам два косые черты, например:
[prompt]$ ls -d */ app// cgi-bin// lib// pub//Это, вероятно, потому, что где-то ваши файлы конфигурации оболочки или сеанса псевдоним команды ls для версии ls, которая включает флаг-F. Этот флаг добавляет символ к каждому выходному имени (это не простой файл), указывающий на то, что это такое. Таким образом, одна косая черта-это от соответствия шаблону'*/', а другая косая черта-это добавленный тип указатель.
чтобы избавиться от этой проблемы, вы можете, конечно, определить другой псевдоним для ls. Однако, чтобы временно не вызывать псевдоним, вы можете добавить команду с обратной косой чертой:
\ls-d */
Я просто добавляю это к моему
.bashrcфайл (вы также можете просто ввести его в командной строке, если вам нужно / нужно только для одного сеанса)alias lsd='ls -ld */'тогда ЛСД даст желаемый результат.
если скрытый каталог не нужно перечислять, я предлагаю:
ls -l | grep "^d" | awk -F" " '{print }'и если скрытые каталоги необходимо перечислить, используйте:
ls -Al | grep "^d" | awk -F" " '{print }'или
find -maxdepth 1 -type d | awk -F"./" '{print }'
фактический
lsрешение, включая символические ссылки в каталогахмногие ответы здесь на самом деле не используют
ls(или использовать его только в тривиальном смыслеls -d, при использовании подстановочных знаков для фактического сопоставления подкаталогов. Истинныйlsрешение полезно, Так как позволяет использоватьlsопции порядок сортировки и т. д.исключая символические ссылки
одно решение с помощью
lsбыл дан, но он делает что-то отличное от других решения в том, что он исключает символические ссылки в каталогах:ls -l | grep '^d'(возможно, трубопровод через
sedилиawkчтобы изолировать имена файлов)включая символические ссылки
в случае (вероятно, более распространенном), что символические ссылки на каталоги должны быть включены, мы можем использовать на
ls:ls -1p | grep '/$'или, избавляясь от косых черт:
ls -1p | grep '/$' | sed 's/\/$//'мы можем добавить опции в
lsкак необходимо (если используется длинный список, то-1больше не требуется).Примечание: если мы хочу конечные косые черты, но не хочу, чтобы они были выделены
grep, мы можем хакерски удалить подсветку, сделав фактическую согласованную часть строки пустой:ls -1p | grep -P '(?=/$)'
однострочный список каталогов только из "здесь".
с количеством файлов.
for i in `ls -d */`; do g=`find ./$i -type f -print| wc -l`; echo "Directory $i contains $g files."; done
*/- это имя шаблона, который соответствует директории в текущей директории.чтобы перечислить только каталоги, мне нравится эта функция:
# long list only directories llod () { ls -l --color=always "$@" | grep --color=never '^d' }положите его в ваш .bashrc следующее.
примеры использования:
llod # long listing of all directories in current directory llod -tr # same but in chronological order oldest first llod -d a* # limit to directories beginning with letter 'a' llod -d .* # limit to hidden directoriesПримечание: он сломается, если вы используете . Вот что:
# long list only directories llod () { ls -l --color=always "$@" | egrep --color=never '^d|^[[:digit:]]+ d' }
FYI, если вы хотите распечатать все файлы в многострочном режиме, вы можете сделать
ls -1которая будет печатать каждый файл в отдельной строке. file1 file2 file3
только для перечисления каталоги:
ls -l | grep ^dдля перечисления только файлы:
ls -l | grep -v ^dили же вы можете сделать как: ls-ld */
Я частично решил с помощью :
cd "/path/to/pricipal/folder" for i in $(ls -d .*/); do sudo ln -s "$PWD"/${i%%/} /home/inukaze/${i%%/}; done ln: «/home/inukaze/./.»: can't overwrite a directory ln: «/home/inukaze/../..»: can't overwrite a directory ln: accesing to «/home/inukaze/.config»: too much symbolics links levels ln: accesing to «/home/inukaze/.disruptive»: too much symbolics links levels ln: accesing to «/home/inukaze/innovations»: too much symbolics links levels ln: accesing to «/home/inukaze/sarl»: too much symbolics links levels ln: accesing to «/home/inukaze/.e_old»: too much symbolics links levels ln: accesing to «/home/inukaze/.gnome2_private»: too much symbolics links levels ln: accesing to «/home/inukaze/.gvfs»: too much symbolics links levels ln: accesing to «/home/inukaze/.kde»: too much symbolics links levels ln: accesing to «/home/inukaze/.local»: too much symbolics links levels ln: accesing to «/home/inukaze/.xVideoServiceThief»: too much symbolics links levelsНу, это сводят ко мне, мэру часть :)
добавление, чтобы сделать его полным кругом, чтобы получить путь к каждой папке, используйте комбинацию ответа Альберта, а также Горданов, которые должны быть довольно полезными.
for i in $(ls -d /pathto/parent/folder/*/); do echo ${i%%/}; doneвыход:
/pathto/parent/folder/childfolder1/ /pathto/parent/folder/childfolder2/ /pathto/parent/folder/childfolder3/ /pathto/parent/folder/childfolder4/ /pathto/parent/folder/childfolder5/ /pathto/parent/folder/childfolder6/ /pathto/parent/folder/childfolder7/ /pathto/parent/folder/childfolder8/
file *|grep directoryO/P (на моей машине) --
[root@rhel6 ~]# file *|grep directory mongo-example-master: directory nostarch: directory scriptzz: directory splunk: directory testdir: directoryнад выходом можно уточнить больше путем использование отрезка .
file *|grep directory|cut -d':' -f1 mongo-example-master nostarch scriptzz splunk testdir * could be replaced with any path that's permitted file - determine file type grep - searches for string named directory -d - to specify a field delimiter -f1 - denotes field 1
Comments