Cantumkan hanya direktori di UNIX

219

Saya ingin daftar hanya direktori di jalur yang ditentukan ( lstidak memiliki opsi seperti itu). Juga, dapatkah ini dilakukan dengan satu perintah baris?

S'am
sumber
12
Untuk masa depan: Mungkin dasar-dasar unix / linux jenis pertanyaan yang tidak terlalu sulit terkait pemrograman lebih baik di sana: unix.stackexchange.com
echox

Jawaban:

315

Coba ini ls -d */untuk mendaftar direktori dalam direktori saat ini

David Hancock
sumber
17
Hei, itu bagus sekali, saya selalu terbiasa dengan kami ls -al | grep '^d'- ini jauh lebih ringkas.
paxdiablo
43
mengapa menggunakan * / ?? tolong jelaskan!?
Chandeep
6
Saya tidak memiliki penjelasan yang tepat, namun saya tahu bahwa */memaksa tampilan hanya item yang diakhiri dengan garis miring, yang dalam hal ini akan menjadi direktori, bahkan jika -Fopsi lstidak digunakan. Mirip dengan perilaku ls *phpdan cara menampilkan semua file yang diakhiri dengan phpdalam direktori.
David Hancock
3
@ user975234 Seseorang mengajukan pertanyaan serupa, dan ada tautan yang
user1766760
17
Hanya echo */akan melakukan hal yang sama juga
no.
95

Coba ini:

find . -maxdepth 1 -type d
Robin
sumber
8
Bagi saya ini terlihat seperti cara yang seharusnya dilakukan. Berbeda dengan lssolusi yang disarankan , findsepenuhnya bertanggung jawab untuk melakukan pekerjaan (tidak bergantung pada ekspansi wildcard shell, yang dapat memaksakan batas). Itu juga jauh lebih ringkas.
peterp
1
Hal buruk tentang ini adalah bahwa itu tidak berfungsi jika Anda mencoba untuk mengulangi hasil dan hasil Anda memiliki spasi dalam namanya.
ubiquibacon
2
Atau, jika Anda tidak ingin menyertakan direktori itu sendiri: find * -maxdepth 0 -type d.
James Ko
@ubiquibacon Entah penggunaan finds' -print0atau -execpilihan.
1
Ini sangat lambat, setidaknya di Mac saya. Tampaknya melakukan pencarian rekursif penuh yang findbiasanya dilakukan tetapi hanya menampilkan folder pada kedalaman 1.
Kara Brightwell
22

Pengikut

find * -maxdepth 0 -type d

pada dasarnya memfilter perluasan '*', yaitu semua entri dalam direktori saat ini, berdasarkan -type dketentuan.

Keuntungannya adalah, output sama dengan ls -1 *, tetapi hanya dengan direktori dan entri tidak dimulai dengan titik

radiospiel
sumber
13

Anda bisa menggunakan ls -d */atautree -d

Solusi lain adalah globbing tetapi ini tergantung pada shell yang Anda gunakan dan jika globbing untuk direktori didukung.

Misalnya ZSH:

zsh # ls *(/)
echox
sumber
3
Dengan rasa Unix apa yang Anda dapatkan tree?
Johnsyweb
semua distro linux utama misalnya? maaf, saya tidak mendapatkan pertanyaan?
echox
1
Saya memiliki distro Debian, dan treetidak diinstal secara default (meskipun dalam repositori).
Stephen Schrauger
1
Downvotes karena saya percaya treeperintah ini bukan perintah asli unix (mohon perbaiki jika saya salah).
Tiago Cardoso
10

Karena ada lusinan cara untuk melakukannya, inilah cara lain:

tree -d -L 1 -i --noreport
  • -d: direktori
  • -L: kedalaman pohon (karenanya 1, direktori kerja kami)
  • -i: tidak ada lekukan, hanya cetak nama
  • --neportasi: jangan melaporkan informasi di akhir daftar pohon
alleen1
sumber
Dan terima kasih telah menjelaskan sakelar. Stack Overflow adalah tentang jawaban, saya selalu menghargai ketika orang-orang menyukai Anda dengan penjelasan vs. "Baca saja entri man!" <- itu bukan jawaban.
fusion27
Untuk memulai dari baris 2 (lewati garis dengan hanya satu titik):tree -d -L 1 -i --noreport | tail -n +2
adius
Ini adalah solusi berperingkat tertinggi yang mencantumkan direktori soft-linked dan melakukannya dengan cara yang bermanfaat, memperlihatkannya sebagai tautan. Saya lebih suka variasinya:tree -C -d -L 1 -i --noreport | tail -n+2
Amnon Harel
9
ls -l | grep '^d'

Anda dapat membuat alias dan memasukkannya ke file profil

alias ld="ls -l| grep '^d'"
somesh chandra
sumber
1
tautan tidak dilihat dengan perintah ini. Dan tautan bisa berupa file atau direktori. Contoh: lrwxrwxrwx 1 root root 21 avril 15 17:38 cron -> / lib / init / upstart-job.
c-toesca
7
find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'
mda
sumber
☀ temukan. -maxdepth 1 -type d -name [^ \.] * | sed 's: ^ \ ./ ::' zsh: tidak ditemukan yang cocok: [^.] *
Michael Cole
6

Untuk daftar direktori dalam direktori kerja saat ini ls -d */dapat digunakan. Dan Jika Anda perlu daftar direktori tersembunyi gunakan perintah ini ls -d .*/

kvivek
sumber
6

gunakan ini untuk mendapatkan daftar direktori

ls -d */ | sed -e "s/\///g"
Lakshmi
sumber
ls -d <custom-directory-path> | sed -e "s / \ ///g" tidak berfungsi .. ada petunjuk?
Dhwanit
Terima kasih! Saya hanya ingin daftar direktori tanpa semua izin dan ini berhasil. :)
codingjeremy
5

find specifiedpath -type d

Jika Anda tidak ingin berulang di subdirektori, Anda dapat melakukan ini sebagai gantinya:

find specifiedpath -type d -mindepth 1 -maxdepth 1

Perhatikan bahwa direktori "dot" (yang namanya dimulai dengan .) juga akan dicantumkan; tetapi bukan direktori khusus .juga ... Jika Anda tidak ingin direktori "dot", Anda bisa grepmengeluarkannya:

find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'

DomQ
sumber
1
Suara positif untuk menyebutkan mindepthuntuk menyingkirkan .! 😁
adius
5

Jawabannya akan tergantung pada shell Anda .

Di zsh, misalnya, Anda dapat melakukan hal berikut:

echo *(/)

Dan semua direktori dalam direktori kerja saat ini akan ditampilkan.

Lihat man zshexpnuntuk informasi lebih lanjut.

Pendekatan alternatif akan digunakan find(1), yang harus bekerja pada sebagian besar rasa Unix:

find . -maxdepth 1 -type d -print  

find(1)memiliki banyak kegunaan, jadi saya pasti akan merekomendasikan man find.

Johnsyweb
sumber
4

Anda dapat menggunakan treeperintah dengan dsaklar untuk mencapai ini.

% tree -d tstdir
tstdir
|-- d1
|   `-- d11
|       `-- d111
`-- d2
    `-- d21
        `-- d211

6 directories

lihat man treeuntuk info lebih lanjut.

slm
sumber
Saya tidak mengundurkan diri, hanya memiliki pertanyaan yang sama. Tampaknya jawaban Anda adalah tiruan dari echox, mungkin itu sebabnya ?.
Louis Waweru
1
@ Louis - terima kasih aku bahkan tidak pernah memperhatikan penyebutannya tree. Oh well, bukankah maksud saya untuk mencuri guntur siapa pun.
slm
upvoting untuk visualisasi apa yang dilakukan pohon
Andrejs
Saya percaya downvotes adalah karena itu jawaban yang sama dengan stackoverflow.com/a/3667405/523742
Tiago Cardoso
@TiagoCardoso - milik saya mendahului itu satu per 2 tahun.
slm
2

Jika saya memiliki direktori ini:

ls -l

lrwxrwxrwx  1 nagios nagios     11 août   2 18:46 conf_nagios -> /etc/icinga
-rw-------  1 nagios nagios 724930 août  15 21:00 dead.letter
-rw-r--r--  1 nagios nagios  12312 août  23 00:13 icinga.log
-rw-r--r--  1 nagios nagios   8323 août  23 00:12 icinga.log.gz
drwxr-xr-x  2 nagios nagios   4096 août  23 16:36 tmp

Untuk mendapatkan semua direktori, gunakan -L untuk menyelesaikan tautan:

ls -lL | grep '^d'

drwxr-xr-x 5 nagios nagios   4096 août  15 21:22 conf_nagios
drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

Tanpa -L:

ls -l | grep '^d'

drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

direktori conf_nagios tidak ada.

c-toesca
sumber
2
### If you need full path of dir and list selective dir with "name" of dir(or dir_prefix*):
find $(pwd) -maxdepth 1 -type d -name "SL*"
Surya
sumber
1

Ini berhasil bagi saya:

`ls -F | grep /`

(Tapi, saya beralih ke echo */seperti yang disebutkan oleh @nos)

FractalSpace
sumber
1

Berikut solusi lain yang memperlihatkan direktori yang ditautkan. Saya sedikit lebih suka karena ini adalah subset dari output "normal" ls-l:

ls -1d */ | rev | cut -c2- | rev | xargs ls -ld --color=always
Amnon Harel
sumber
1

Dalam bash:

ls -d */

Akan mencantumkan semua direktori

ls -ld */

akan mendaftar semua direktori dalam bentuk panjang

ls -ld */ .*/

akan mendaftar semua direktori, termasuk direktori tersembunyi, dalam bentuk panjang.


Saya baru saja beralih ke zsh (MacOS Catalina), dan menemukan bahwa:

ls -ld */ .*/

tidak lagi berfungsi jika direktori saat ini tidak mengandung direktori tersembunyi.

zsh: no matches found: .*/

Ini akan mencetak kesalahan di atas, tetapi juga akan gagal mencetak direktori apa pun.

ls -ld *(/) .*(/)

Juga gagal dengan cara yang sama.

Sejauh ini saya telah menemukan bahwa ini:

ls -ld */;ls -ld .*/

adalah solusi yang layak. Ini ;adalah pemisah perintah. Tetapi itu berarti bahwa jika tidak ada direktori tersembunyi, itu akan mendaftar direktori, dan masih mencetak kesalahan tanpa direktori tersembunyi:

foo
bar
zsh: no matches found: .*/

lsadalah perintah shell untuk daftar isi direktori saat ini
-ladalah bendera untuk menentukan bahwa Anda ingin daftar di Longford (satu item per baris + banyak informasi keren lainnya)
-dadalah bendera untuk mendaftar semua direktori "sebagai file" dan tidak secara rekursif
*/adalah argumen 'daftar semua file yang diakhiri dengan slash'
*adalah perintah regex sederhana untuk "apa pun", jadi */meminta shell untuk mendaftar "apa pun yang berakhiran dengan '/'"

Lihat man lsuntuk informasi lebih lanjut.


Saya menempatkan ini:

alias lad="ls -ld */;ls -ld .*/"

di .zshrc saya, dan sepertinya berfungsi dengan baik.

CATATAN: Saya juga menemukan itu

ls -ld .*/ 2> /dev/null

tidak berfungsi, karena masih mencetak sterr ke terminal. Saya akan memperbarui jawaban saya jika / ketika saya menemukan solusi.

DryLabRebel
sumber
0

du -d1mungkin merupakan pilihan terpendek. (Selama Anda tidak perlu menyalurkan input ke perintah lain.)

Mohan
sumber
0

Untuk mendaftar hanya direktori di jalur yang ditentukan, cukup ketik ls -l | grep drw

Loui
sumber
Ini mungkin termasuk file, jika ada nama file yang disertakan drw, dan akan mengecualikan direktori yang tidak dapat dibaca dan -dapat ditulis oleh pemilik. grep ^dbekerja lebih baik.
Tom Zych
0

Daftar direktori yang panjang

  • ls-l | grep '^ d'
  • ls-l | grep "^ d"

Direktori daftar
- ls -d * /

Athi
sumber
Apakah Anda punya alasan untuk menggandakan jawaban yang sudah ada?
Maxim Sagaydachny