Saya ingin daftar hanya direktori di jalur yang ditentukan ( lstidak memiliki opsi seperti itu). Juga, dapatkah ini dilakukan dengan satu perintah baris?
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
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
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
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
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 .*/
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:
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.
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.
Jawaban:
Coba ini
ls -d */
untuk mendaftar direktori dalam direktori saat inisumber
ls -al | grep '^d'
- ini jauh lebih ringkas.*/
memaksa tampilan hanya item yang diakhiri dengan garis miring, yang dalam hal ini akan menjadi direktori, bahkan jika-F
opsils
tidak digunakan. Mirip dengan perilakuls *php
dan cara menampilkan semua file yang diakhiri denganphp
dalam direktori.echo */
akan melakukan hal yang sama jugaCoba ini:
sumber
ls
solusi yang disarankan ,find
sepenuhnya bertanggung jawab untuk melakukan pekerjaan (tidak bergantung pada ekspansi wildcard shell, yang dapat memaksakan batas). Itu juga jauh lebih ringkas.find * -maxdepth 0 -type d
.find
s'-print0
atau-exec
pilihan.find
biasanya dilakukan tetapi hanya menampilkan folder pada kedalaman 1.Pengikut
pada dasarnya memfilter perluasan '*', yaitu semua entri dalam direktori saat ini, berdasarkan
-type d
ketentuan.Keuntungannya adalah, output sama dengan
ls -1 *
, tetapi hanya dengan direktori dan entri tidak dimulai dengan titiksumber
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:
sumber
tree
?tree
tidak diinstal secara default (meskipun dalam repositori).tree
perintah ini bukan perintah asli unix (mohon perbaiki jika saya salah).Karena ada lusinan cara untuk melakukannya, inilah cara lain:
sumber
tree -d -L 1 -i --noreport | tail -n +2
tree -C -d -L 1 -i --noreport | tail -n+2
Anda dapat membuat alias dan memasukkannya ke file profil
sumber
sumber
Untuk daftar direktori dalam direktori kerja saat ini
ls -d */
dapat digunakan. Dan Jika Anda perlu daftar direktori tersembunyi gunakan perintah inils -d .*/
sumber
gunakan ini untuk mendapatkan daftar direktori
sumber
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 bisagrep
mengeluarkannya:find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'
sumber
mindepth
untuk menyingkirkan.
! 😁Jawabannya akan tergantung pada shell Anda .
Di
zsh
, misalnya, Anda dapat melakukan hal berikut:Dan semua direktori dalam direktori kerja saat ini akan ditampilkan.
Lihat
man zshexpn
untuk informasi lebih lanjut.Pendekatan alternatif akan digunakan
find(1)
, yang harus bekerja pada sebagian besar rasa Unix:find(1)
memiliki banyak kegunaan, jadi saya pasti akan merekomendasikanman find
.sumber
Anda dapat menggunakan
tree
perintah dengand
saklar untuk mencapai ini.lihat
man tree
untuk info lebih lanjut.sumber
tree
. Oh well, bukankah maksud saya untuk mencuri guntur siapa pun.Jika saya memiliki direktori ini:
ls -l
Untuk mendapatkan semua direktori, gunakan -L untuk menyelesaikan tautan:
ls -lL | grep '^d'
Tanpa -L:
ls -l | grep '^d'
direktori conf_nagios tidak ada.
sumber
sumber
Ini berhasil bagi saya:
(Tapi, saya beralih ke
echo */
seperti yang disebutkan oleh @nos)sumber
Berikut solusi lain yang memperlihatkan direktori yang ditautkan. Saya sedikit lebih suka karena ini adalah subset dari output "normal" ls-l:
sumber
Dalam bash:
Akan mencantumkan semua direktori
akan mendaftar semua direktori dalam bentuk panjang
akan mendaftar semua direktori, termasuk direktori tersembunyi, dalam bentuk panjang.
Saya baru saja beralih ke zsh (MacOS Catalina), dan menemukan bahwa:
tidak lagi berfungsi jika direktori saat ini tidak mengandung direktori tersembunyi.
Ini akan mencetak kesalahan di atas, tetapi juga akan gagal mencetak direktori apa pun.
Juga gagal dengan cara yang sama.
Sejauh ini saya telah menemukan bahwa ini:
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:ls
adalah perintah shell untuk daftar isi direktori saat ini-l
adalah bendera untuk menentukan bahwa Anda ingin daftar di Longford (satu item per baris + banyak informasi keren lainnya)-d
adalah 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 ls
untuk 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.
sumber
du -d1
mungkin merupakan pilihan terpendek. (Selama Anda tidak perlu menyalurkan input ke perintah lain.)sumber
Untuk mendaftar hanya direktori di jalur yang ditentukan, cukup ketik ls -l | grep drw
sumber
drw
, dan akan mengecualikan direktori yang tidak dapat dibaca dan -dapat ditulis oleh pemilik.grep ^d
bekerja lebih baik.Daftar direktori yang panjang
Direktori daftar
- ls -d * /
sumber