Ответы:
*/
является шаблоном, который соответствует всем подкаталогам в текущем каталоге ( *
будет соответствовать всем файлам и подкаталогам; /
ограничивает его каталогами). Точно так же, чтобы вывести список всех подкаталогов в / home / alice / Documents, используйтеls -d /home/alice/Documents/*/
*/
не будет соответствовать ни одной скрытой папки. Чтобы включить их, либо укажите их явно как ls -d .*/ */
, либо установите dotglob
параметр в Bash.
ls
что-то, чего не существует.
ls */
расширится до просто ls
, что приведет к выводу списка всех файлов в текущем каталоге. Я уверен, что это не то, что вы хотите в этом случае.
echo
Пример: echo */
, echo */*/
Вот что я получил:
cs/ draft/ files/ hacks/ masters/ static/
cs/code/ files/images/ static/images/ static/stylesheets/
ls
толькоПример: ls -d */
Вот именно то, что я получил:
cs/ files/ masters/
draft/ hacks/ static/
Или как список (с подробной информацией): ls -dl */
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 static
Пример: for i in $(ls -d */); do echo ${i%%/}; done
вот что я получил:
cs
draft
files
hacks
masters
static
Если вы хотите, чтобы в качестве завершающего символа был символ «/», команда будет выглядеть так: for i in $(ls -d */); do echo ${i}; done
cs/
draft/
files/
hacks/
masters/
static/
3
был заметно медленнее, чем другие для меня. В каталоге, который я тестировал: 1
0,012, 2
0,016, 3
055 , 4
021.
1
это мой любимый.
time
функцию Unix. /// Согласен, echo */
умнее чем ls -d */
.
1.
опция вызовет серьезные проблемы при работе с именами папок с пробелами.
Я использую:
ls -d */ | cut -f1 -d'/'
Это создает один столбец без косой черты - полезно в сценариях.
Мои два цента.
-1
Вариант ls
будет выводить в формате одного столбца , а также, как и в ls -1 -d */
.
-1
прежнему выводит косую черту для каждой записи.
.bashrc
как псевдоним, как мне добавить '/'
?
'\/'
| sed -e 's-/$--'
Для всех папок без подпапок:
find /home/alice/Documents -maxdepth 1 -type d
Для всех папок с подпапками:
find /home/alice/Documents -type d
find /home/alice/Documents -maxdepth 1 -mindepth 1 -type d
противном случае вы включаете /home/alice/Documents
себя. Чтобы включить символические ссылки на каталоги, -L
Неупомянута звездочка *
будет интерпретироваться как шаблон (Glob) с помощью оболочки.
Оболочка будет использовать его в расширении пути.
Затем он сгенерирует список имен файлов, которые соответствуют шаблону.
Простая звездочка будет соответствовать всем именам файлов в PWD (текущий рабочий каталог).
Более сложный шаблон, который */
будет соответствовать всем именам файлов, оканчивающимся на /
.
Итак, все каталоги. Вот почему команда:
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. -d
Вариант ls
делает его перечисляют настоящий элемент каталога вместо содержимого каждого каталога (представленных по умолчанию).
ls -d */
Однако эта команда (несколько) менее надежна. Сбой с нечетными именованными файлами, перечисленными выше. Он захлебнется несколькими именами. Вы должны стереть один за другим, пока не найдете те, у кого проблемы.
GNU ls
примет --
клавишу «конец опций» ( ).
ls -d ./*/ ### more reliable BSD ls
ls -d -- */ ### more reliable GNU ls
Чтобы отобразить каждый каталог в отдельной строке (в одном столбце, аналогично ls -1), используйте:
$ printf "%s\n" */ ### Correct even with "-", spaces or newlines.
И, что еще лучше, мы могли бы убрать трейлинг /
:
$ set -- */; printf "%s\n" "${@%/}" ### Correct with spaces and newlines.
Попытка как это:
$ for i in $(ls -d */); do echo ${i%%/}; done
Сбой на:
ls -d */
), как уже показано выше.IFS
.IFS
).Наконец, использование списка аргументов внутри функции не повлияет на список аргументов текущей запущенной оболочки. Просто:
$ listdirs(){ set -- */; printf "%s\n" "${@%/}"; }
$ listdirs
представляет этот список:
--
-
*
cs
dir with spaces
draft
files
-h
masters
-n
static
-v var
Эти параметры безопасны с несколькими типами нечетных имен файлов.
Команда 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 */'
тогда lsd выдаст желаемый результат.
ls
решение, включая символические ссылки на каталогиМногие ответы здесь на самом деле не используют ls
(или используют только в тривиальном смысле ls -d
, когда используют подстановочные знаки для фактического соответствия подкаталога. Истинное ls
решение полезно, поскольку оно позволяет использовать ls
параметры для порядка сортировки и т. Д.
ls
Было дано одно использование решения , но оно отличается от других решений тем, что исключает символические ссылки на каталоги:
ls -l | grep '^d'
(возможно перебирать sed
или awk
изолировать имена файлов)
В (возможно, более распространенном) случае, когда символические ссылки на каталоги должны быть включены, мы можем использовать -p
опцию ls
, которая позволяет добавлять символ косой черты к именам каталогов (включая символьные):
ls -1p | grep '/$'
или, избавляясь от конечных слешей:
ls -1p | grep '/$' | sed 's/\/$//'
Мы можем добавлять опции по ls
мере необходимости (если используется длинный список, -1
он больше не требуется).
примечание: если нам нужны конечные косые черты, но мы не хотим, чтобы они выделялись grep
, мы можем хакерски убрать выделение, сделав пустую текущую совпадающую часть строки:
ls -1p | grep -P '(?=/$)'
Если скрытый каталог не требуется перечислять, я предлагаю:
ls -l | grep "^d" | awk -F" " '{print $9}'
И если нужно перечислить скрытые каталоги, используйте:
ls -Al | grep "^d" | awk -F" " '{print $9}'
ИЛИ
find -maxdepth 1 -type d | awk -F"./" '{print $2}'
awk
, пожалуйста, посмотрите на этот ответ
показывать списки папок без /
ls -d */|sed 's|[/]||g'
ls -d1 */ | tr -d "/"
Вот что я использую
ls -d1 /Directory/Path/*;
ls -d1 /Directory/Path/*/
Для просмотра только каталогов :
ls -l | grep ^d
для просмотра только файлов :
ls -l | grep -v ^d
или также вы можете сделать как: ls -ld * /
Проверьте, является ли элемент каталогом с test -d
:
for i in $(ls); do test -d $i && echo $i ; 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
ПРИМЕЧАНИЕ: он сломается, если вы используете -i
опцию. Вот исправление для этого:
# long list only directories
llod () {
ls -l --color=always "$@" | egrep --color=never '^d|^[[:digit:]]+ d'
}
К вашему сведению, если вы хотите распечатать все файлы в несколько строк, вы можете выполнить команду, ls -1
которая будет печатать каждый файл в отдельной строке. файл1 файл2 файл3
Я частично решил с:
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/
Использование Perl:
ls | perl -nle 'print if -d;'
Вот что я использую для перечисления только имен каталогов:
ls -1d /some/folder/*/ | awk -F "/" "{print \$(NF-1)}"
Вот вариант с использованием дерева, который выводит имена каталогов только в отдельных строках, да, это уродливо, но эй, это работает.
tree -d | grep -E '^[├|└]' | cut -d ' ' -f2
или с awk
tree -d | grep -E '^[├|└]' | awk '{print $2}'
Это, вероятно, лучше, однако, и сохранит /
имя каталога после.
ls -l | grep "^d" | awk '{print $9}'
file *|grep directory
O / 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
Самая короткая команда из всех (на самом деле хак) для перечисления только каталогов. Введите абсолютный путь или относительный путь интересующего каталога и нажмите ввод, чтобы ввести интересующий каталог. Теперь введите cd
и нажмите клавишу Tab . Только каталоги показаны сейчас.
user@ubuntu:~/Desktop$cd <tab key>
Приведенная выше команда теперь должна отображать только папки на рабочем столе . Самый короткий.
-d
самом деле означает.