Відповіді:
*/- це шаблон, який відповідає всім підкаталогам у поточному каталозі ( *відповідатиме всім файлам і підкаталогам; /обмежує його до каталогів). Так само, щоб перелічити всі підкаталоги в / 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насправді означає.