Відповіді:
*/
- це шаблон, який відповідає всім підкаталогам у поточному каталозі ( *
відповідатиме всім файлам і підкаталогам; /
обмежує його до каталогів). Так само, щоб перелічити всі підкаталоги в / home / alice / Documents, використовуйтеls -d /home/alice/Documents/*/
*/
не відповідають жодним прихованим папкам. Щоб включити їх, або вкажіть їх явно як ls -d .*/ */
, або встановіть dotglob
параметр у Bash.
ls
щось, що не існує.
shopt -s nullglob
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
.012s, 2
.016s, 3
.055s , 4
.021s.
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
прийме клавішу "end of options" ( --
).
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 * /
*/
- це шаблон відповідності імені файлів, який відповідає каталогам у поточному каталозі.
Для переліку лише каталогів мені подобається ця функція:
# 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'
}
FYI, якщо ви хочете надрукувати всі файли в багаторядковому режимі, ви можете зробити ls -1
друк кожного файлу в окремому рядку. file1 file2 file3
Я частково вирішив:
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
Найкоротша команда коли-небудь (насправді хак) для переліку лише каталогів. Введіть абсолютний шлях або відносний шлях до каталогу, що цікавить, і натисніть клавішу Enter, щоб увійти в каталог, що цікавить. Тепер введіть cd
і натисніть клавішу вкладки . Зараз показані лише каталоги.
user@ubuntu:~/Desktop$cd <tab key>
Наведена вище команда тепер повинна відображати лише папки на робочому столі . Найкоротший справді.
-d
насправді означає.