Perintah 'ls -d' tidak menampilkan direktori. Apakah ada cara untuk membuat 'ls' hanya menampilkan direktori alih-alih file dan direktori?

44

Apakah ada cara untuk lshanya menampilkan direktori alih-alih file dan direktori?

Dari halaman manual:

   -d, --directory
          list directory entries instead of contents, and do not  derefer
          ence symbolic links

Jadi jika saya mengetiknya di /direktori saya berharap hanya melihat direktori. Sebaliknya itu menunjukkan "."

$ cd /
$ ls -d
.

Saya berharap ls -duntuk menunjukkan ini kepada saya:

$ ls -d
bin    data  home        opt    sbin  sys      var
boot   dev   lib         media  proc  selinux  tmp
cdrom  etc   lost+found  mnt    root  srv      usr

Apakah ada cara untuk lshanya menampilkan direktori alih-alih file dan direktori?

nelaaro
sumber
17
lsd bisa sangat membingungkan.
boehj
2
@jin ls -d * / works. Tetapi mengapa saya harus "* /" untuk mendapatkan put yang saya inginkan.
nelaaro
8
@nelaar -dtidak bermaksud mendaftar direktori saja, itu berarti tidak mendaftar isi direktori. Coba ketikkan ls */dan Anda akan melihat isi dari semua direktori.
Jin
2
Saya telah ldiralised ke ls -d */dalam saya .bashrcini lebih mudah ... untuk membuat
DQdlM
1
Itu bisa memberi Anda banyak informasi tetapi tidak satu bendera tunggal hanya untuk menunjukkan direktori ...
DimiDak

Jawaban:

50

Harapan Anda didasarkan pada DOS Think / Windows Think dan salah. Pada MS-DOS, Windows, dan memang beberapa sistem operasi IBM / Microsoft lainnya, ekspansi wildcard dilakukan oleh perintah itu sendiri, dan hal-hal seperti /aopsi untuk dirperintah tersebut bertindak sebagai filter atribut selama ekspansi wildcard. dirmemperluas wildcard seperti *, yang ditafsirkan oleh penerjemah perintah, apa adanya, dan jika /aditentukan, berlaku filter yang sesuai dengan apa yang dikembalikan. (Pada beberapa sistem operasi, filter atribut dapat diberikan kepada panggilan sistem untuk penghitungan direktori dan kernel sistem operasi, atau driver sistem file, menerapkannya sendiri.)

Pada Unices dan di Linux, ekspansi wildcard dilakukan oleh shell, dan tidak mengetahui izin. Ketika, di direktori root, Anda melakukannya

ls *

apa lsperintah itu sendiri terima dari shell adalah (sesuatu seperti)

ls bin home opt var boot dev tmp dll hilang + ditemukan root usr

Apa yang -d/ --directoryopsi ini adalah mematikan apa yang biasanya terjadi selanjutnya . Apa yang biasanya terjadi selanjutnya adalah lsmelihat pada masing-masing argumen pada gilirannya, melihat bahwa mereka adalah direktori, dan memutuskan untuk menyebutkan isinya. Untuk argumen yang menamai file, itu hanya mencetak informasi untuk file itu sendiri. Dengan -dopsi ini, direktori diperlakukan seperti file. Jadi, lscetak informasi untuk masing-masing direktori yang dilewatkan sebagai argumennya, sama seperti yang akan dilakukan jika mereka adalah file.

Jadi -d bukan opsi "print only directories". Bahkan, tidak hanya tidak ada opsi seperti itu; ada tidak bisa menjadi seperti pilihan. Ekspansi wildcard dilakukan oleh shell, dan ( shsetidaknya dalam POSIX ) tidak ada cara untuk memberitahu shell untuk memeriksa izin dan tipe file bit ketika diperluas *menjadi daftar nama. Untuk mendapatkan daftar nama-nama direktori saja, perlu menggunakan findperintah, seperti yang dijelaskan oleh ztank1013, atau menggunakan trik bahwa pathname yang diakhiri dengan slash menyiratkan entri direktori ., seperti yang dijelaskan oleh Jin. ( JinTrik berakhir dengan lsperintah yang menerima argumen

ls bin / home / opt / var / boot / dev / tmp / etc / lost + found / root / usr /

karena pola */sebenarnya mencocokkan nama path dengan dua komponen, yang kedua kosong, dan tidak cukup melakukan apa yang diinginkan. Secara khusus, ini akan memperlakukan tautan simbolis yang menunjuk ke direktori seolah-olah itu adalah direktori.)

Perilaku ls -dtanpa a *adalah perpanjangan sederhana di atas. Satu hanya harus tahu satu hal lagi ls: Ketika tidak diberikan argumen, itu mengasumsikan argumen default .. Sekarang tanpa itu -dpilihan, perilaku mengarah tersebut dengan isi direktori nama oleh .yang disebutkan dan informasi untuk isinya ditampilkan. Dengan yang -dpilihan, direktori .diperlakukan hanya seolah-olah itu sebuah file, dan informasi sendiri ditampilkan, bukan isinya disebutkan.

JdeBP
sumber
3
" tidak mungkin ada opsi seperti itu" - itu pernyataan yang agak kuat - implementasi opsi semacam itu sudah jelas: lihat argumen non-direktori dan abaikan saja. Apa yang tidak dapat diimplementasikan adalah setara dengan dir /s *.txt[tanpa menggunakan untuk mengutip wildcard seperti untuk menemukan]
Random832
6
Benar, tetapi tidak ada alasan logis mengapa tidak dapat memiliki opsi yang akan memfilter item yang disahkan sebagai argumen. Fakta bahwa "ekspansi wildcard terpisah dari pengecekan tipe entri" tidak relevan, karena ini sama sekali tidak ada hubungannya dengan ekspansi wildcard - hanya pengecekan jenis entri, yang tidak ada alasannya tidak dapat dilakukan sepenuhnya dalam ls. Jika ls --color dapat menaungi mereka biru, ls -F dapat menempatkan / setelah mereka, dan ls-l dapat menempatkan 'd' dalam mode, maka beberapa opsi hipotetis lainnya bisa menghilangkannya. Bahwa opsi semacam itu tidak ada tidak berarti " tidak bisa ".
Random832
5
Random832 membuat poin yang layak: ls bisa memiliki opsi untuk memfilter file atau direktori, dan ini tidak eksklusif dengan memiliki shell melakukan ekspansi. Tidak ada kondisi balapan di dalam ls: ia dapat memfilternya karena statistik file secara normal. (Sudah ada perlombaan antara ekspansi shell dan ls, FWIW.) Saya pikir ekspansi shell hanya bagian dari alasannya: ekspansi shell (dan penyaringan secara umum) tidak diterapkan di ls karena itu perlu diimplementasikan lagi di cp , mv, dll. Unix adalah "lakukan satu hal dan lakukan dengan baik". Jika Anda memerlukan pemfilteran tingkat lanjut, ada alat untuk itu.
Thanatos
2
The ls -ppilihan menambahkan /simbol ke direktori saja. Tidak ada alasan untuk tidak memperluas kemampuan pencetakan dengan sesuatu yang hanya menghasilkan ini (bukan ls -p | grep /).
Anne van Rossum
3
@JdeBP, serangan ad-hominem ("kiddo") dan arogansi (semua orang kecuali Anda tidak tahu "dasar-dasar Unix") tidak termasuk dalam diskusi teknis. Selain itu, Anda menarik pria jerami ketika Anda berpendapat bahwa opsi perintah tidak dapat mengontrol ekspansi wildcard yang dilakukan oleh shell. Tentu saja tidak bisa! Baik Random832, maupun Thanatos, maupun Anne van Rossum, dan bahkan pertanyaan itu sendiri tidak menyebutkan wildcard. Keberatannya adalah bahwa ls --only-directories .opsi dapat ditambahkan pada lsakhirnya.
mkalkov
30

Anda dapat menggunakan ls -d */, atau ls -d .*/untuk direktori tersembunyi.

Jin
sumber
trik pintar menggunakan /!
Mono
Ya ini bagus. Apakah ada kasus di mana ini tidak berhasil?
iyrin
5
+1 untuk memberikan jawaban dalam satu baris. Saya menduga jawaban yang diterima juga memilikinya, di suatu tempat.
Kalkulus Knight
Bagaimana Anda bisa menggunakan ini dalam skrip tanpa berada di direktori?
DimiDak
13

Coba ini

 find . -mindepth 1 -maxdepth 1 -type d

untuk mendapatkan direktori di bawah lokasi Anda saat ini.

ztank1013
sumber
5

Anda mungkin juga suka

tree -d 

yang dengan rapi mencantumkan semua direktori dan subdirektori dengan penggambaran grafis struktur pohon.

fuenfundachtzig
sumber
3
Dan hanya sedalam satu tingkat:tree -dL 1
Anne van Rossum
Sayangnya Anda tidak dapat menggabungkan banyak dengan pohon. # tree -d | grep wc -l (input standar)
DimiDak
5

Jika Anda ingin melihat direktori hanya dengan ls -lopsi detail seperti (ELL) maka Anda dapat menggunakan di bawah ini:

find -maxdepth 1 -type d -ls;

Di atas hanya akan memberikan detail seperti yang Anda dapatkan dengan -lpilihan.

Adnan Bhatti
sumber
1
Mungkin lebih baik digunakan find -maxdepth 1 -type d -exec ls -d {} +untuk mendapatkan output dalam lsformat yang biasa .
mkalkov
4

Jika Anda ingin menyelesaikan pekerjaan dengan cara lain, coba ini:

ls -l | grep ^d

Meskipun satu alat sudah cukup dalam situasi ini. Jalur pipa selalu ada untuk membantu Anda. Saya suka fleksibilitas di Linux, yang saya harap Anda lakukan.

Bohr
sumber
1
Ini akan menyaring lebih dari sekadar direktori.
ocodo
2
@ Slomojo, ini akan menyaring semua kecuali direktori. Apa yang kamu maksud?
mkalkov
Ya, Anda memerlukan -l (panjang) sehingga izin menuju garis depan. "d" untuk direktori. Plus Anda mendapatkan daftar "panjang" dari entri direktori yang bagus.
geoO
1

Saya harap ini akan memperbaiki kebutuhan Anda. Perintah di bawah ini hanya akan menampilkan direktori di jalur yang diberikan.

ls -F <path> | grep /

Contoh:

ls -F ~ | grep /
Thiyagu ATR
sumber