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?


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


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

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


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 *(/)

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

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'"

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:^\./::'

☀ 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 .*/


6

gunakan ini untuk mendapatkan daftar direktori

ls -d */ | sed -e "s/\///g"

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 '^\.'


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.


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.


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.


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*"

1

Ini berhasil bagi saya:

`ls -F | grep /`

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


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

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.


0

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


0

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


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 * /


Apakah Anda punya alasan untuk menggandakan jawaban yang sudah ada?
— Maxim Sagaydachny
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.