Perintah ini mencantumkan direktori di jalur saat ini: ls -d */
Apa sebenarnya yang dilakukan polanya */
?
Dan bagaimana kita bisa memberikan path absolut dalam perintah di atas (mis. ls -d /home/alice/Documents
) Untuk mendaftar hanya direktori di path itu?
-d
sebenarnya dimaksud.Jawaban:
*/
adalah pola yang cocok dengan semua subdirektori di direktori saat ini (*
akan cocok dengan semua file dan subdirektori; yang/
membatasinya ke direktori). Demikian pula, untuk mendaftar semua subdirektori di bawah / home / alice / Documents, gunakanls -d /home/alice/Documents/*/
sumber
*/
tidak akan cocok dengan folder tersembunyi. Untuk memasukkannya, tentukan secara eksplisit seperti merekals -d .*/ */
, atau tetapkandotglob
opsi dalam Bash.ls
sesuatu yang tidak ada.shopt -s nullglob
ls */
akan diperluas menjadi adills
, yang akan mencantumkan semua file di direktori saat ini. Saya cukup yakin bukan itu yang Anda inginkan dalam kasus itu.Empat cara untuk menyelesaikan ini, masing-masing dengan format output yang berbeda
1. Menggunakan
echo
Contoh:
echo */
,echo */*/
Berikut adalah apa yang saya punya:
2. Menggunakan
ls
hanyaContoh:
ls -d */
Inilah yang saya dapatkan:
Atau sebagai daftar (dengan info detail):
ls -dl */
3. Menggunakan
ls
dangrep
Contoh:
ls -l | grep "^d"
Ini yang saya dapat:4. Bash Script (Tidak disarankan untuk nama file yang mengandung spasi)
Contoh:
for i in $(ls -d */); do echo ${i%%/}; done
Ini yang saya dapat:
Jika Anda ingin memiliki '/' sebagai karakter akhir, perintahnya adalah:
for i in $(ls -d */); do echo ${i}; done
sumber
3
terasa lebih lambat daripada yang lain bagi saya. Dalam direktori saya menguji:1
.012s,2
.016s,3
.055s ,4
.021s.1
adalah favorit saya.time
, fungsi Unix. /// Saya setuju,echo */
lebih pintar darils -d */
.1.
pilihan akan menyebabkan nyeri utama ketika berhadapan dengan nama-nama folder yang memiliki ruang.Saya menggunakan:
Ini membuat satu kolom tanpa garis miring - berguna dalam skrip.
Dua sen saya.
sumber
-1
pilihan untukls
akan menampilkan dalam format single-kolom juga, seperti dalamls -1 -d */
.-1
masih menampilkan garis miring untuk setiap entri..bashrc
sebagai alias, bagaimana cara saya menambahkan'/'
?'\/'
| sed -e 's-/$--'
Untuk semua folder tanpa subfolder:
Untuk semua folder dengan subfolder:
sumber
find /home/alice/Documents -maxdepth 1 -mindepth 1 -type d
jika tidak Anda sertakan/home/alice/Documents
sendiri. Untuk memasukkan symlink ke direktori,-L
4 (lebih banyak) Opsi yang Dapat Diandalkan.
Tanda bintang yang tidak dikutip
*
akan ditafsirkan sebagai pola (gumpalan) oleh shell.Shell akan menggunakannya dalam ekspansi pathname.
Ini kemudian akan menghasilkan daftar nama file yang cocok dengan pola tersebut.
Tanda bintang sederhana akan cocok dengan semua nama file di PWD (direktori kerja saat ini).
Pola yang lebih kompleks karena
*/
akan cocok dengan semua nama file yang berakhiran/
.Jadi, semua direktori. Itu sebabnya perintah:
1.- gema.
akan diperluas (oleh shell) ke
echo
semua direktori di PWD.Untuk menguji ini: Buat direktori (
mkdir
) bernama seperti test-dir, dancd
ke dalamnya:Buat beberapa direktori:
Perintah
echo ./*/
akan tetap dapat diandalkan bahkan dengan file bernama aneh:Tetapi spasi dalam nama file membuat membaca sedikit membingungkan.
Jika alih-alih
echo
, kami menggunakanls
, shell masih memperluas daftar nama file. Shell adalah alasan untuk mendapatkan daftar direktori di PWD. The-d
pilihan untukls
merek itu daftar entri direktori ini bukan isi dari setiap direktori (seperti yang disajikan secara default).Namun, perintah ini (agak) kurang dapat diandalkan. Ini akan gagal dengan file aneh bernama di atas. Ini akan tersedak dengan beberapa nama. Anda perlu menghapus satu per satu sampai Anda menemukan yang bermasalah.
2.-
GNU
ls
akan menerima kunci "akhir opsi" (--
).3.-printf
Untuk membuat daftar setiap direktori di barisnya sendiri (dalam satu kolom, mirip dengan ls -1), gunakan:
Dan, yang lebih baik lagi, kita dapat menghapus trailing
/
:Upaya seperti ini:
Akan gagal pada:
ls -d */
) seperti yang sudah ditunjukkan di atas.IFS
.IFS
).4.- Fungsi
Akhirnya, menggunakan daftar argumen di dalam suatu fungsi tidak akan mempengaruhi daftar argumen dari shell yang sedang berjalan. Secara sederhana:
menyajikan daftar ini:
Opsi ini aman dengan beberapa jenis nama file aneh.
sumber
The
tree
Perintah ini juga cukup berguna di sini. Secara default akan menampilkan semua file dan direktori ke kedalaman penuh, dengan beberapa karakter ascii menampilkan pohon direktori.Tetapi jika kami hanya ingin mendapatkan direktori, tanpa pohon ascii, dan dengan path lengkap dari direktori saat ini, Anda dapat melakukannya:
Argumennya adalah:
Dan jika Anda menginginkan path absolut, Anda bisa mulai dengan menentukan path lengkap ke direktori saat ini:
Dan untuk membatasi jumlah subdirektori, Anda dapat mengatur level maksimum subdirektori dengan
-L level
, misalnya:Lebih banyak argumen dapat dilihat dengan pohon manusia
sumber
Jika Anda bertanya-tanya mengapa output dari 'ls -d * /' memberi Anda dua garis miring, seperti:
mungkin karena suatu tempat file konfigurasi shell atau sesi Anda alias perintah ls ke versi ls yang menyertakan flag -F. Bendera itu menambahkan karakter ke setiap nama keluaran (itu bukan file biasa) yang menunjukkan jenisnya. Jadi satu garis miring adalah dari pencocokan pola '* /', dan garis miring lainnya adalah indikator jenis yang ditambahkan.
Untuk menghilangkan masalah ini, Anda tentu saja dapat mendefinisikan alias berbeda untuk ls. Namun, untuk sementara tidak memanggil alias, Anda bisa menambahkan perintah dengan backslash:
\ ls -d * /
sumber
Saya hanya menambahkan ini ke
.bashrc
file saya (Anda juga bisa mengetiknya di baris perintah jika Anda hanya perlu / menginginkannya untuk satu sesi)maka lsd akan menghasilkan hasil yang diinginkan.
sumber
ls
Solusi aktual , termasuk symlink ke direktoriBanyak jawaban di sini yang tidak benar-benar digunakan
ls
(atau hanya menggunakannya dalam pengertian sepelels -d
, saat menggunakan wildcard untuk pencocokan subdirektori yang sebenarnya.ls
Solusi yang benar berguna, karena memungkinkan penggunaanls
opsi untuk mengurutkan pesanan, dll.Tidak termasuk symlink
Satu solusi menggunakan
ls
telah diberikan, tetapi ia melakukan sesuatu yang berbeda dari solusi lain di dalamnya tidak termasuk symlink ke direktori:(mungkin disalurkan melalui
sed
atauawk
mengirim untuk mengisolasi nama file)Termasuk symlink
Dalam kasus (mungkin lebih umum) yang menyertakan symlink ke direktori, kita dapat menggunakan
-p
opsils
, yang membuatnya menambahkan karakter slash ke nama direktori (termasuk yang symlink):atau, menghilangkan garis miring:
Kami dapat menambahkan opsi
ls
sesuai kebutuhan (jika daftar panjang digunakan,-1
tidak lagi diperlukan).catatan: jika kita ingin membuntuti garis miring, tetapi tidak ingin mereka disorot
grep
, kita dapat menghapus sorotan dengan membuat bagian yang cocok dari baris itu kosong:sumber
Jika direktori tersembunyi tidak perlu dicantumkan, saya menawarkan:
Dan jika direktori tersembunyi perlu dicantumkan, gunakan:
ATAU
sumber
awk
, silakan lihat jawabanuntuk menampilkan daftar folder tanpa
/
sumber
ls -d1 */ | tr -d "/"
set -- */; printf "%s\n" "${@%/}"
Inilah yang saya gunakan
ls -d1 /Directory/Path/*;
sumber
ls -d1 /Directory/Path/*/
Untuk daftar direktori saja :
hanya untuk daftar file :
atau juga Anda dapat melakukan sebagai: ls -ld * /
sumber
Uji apakah item tersebut adalah direktori dengan
test -d
:sumber
*/
adalah pola nama file yang cocok dengan direktori di direktori saat ini.Untuk daftar direktori saja, saya suka fungsi ini:
Masukkan ke dalam .bashrc Anda.
Contoh penggunaan:
CATATAN: itu akan rusak jika Anda menggunakan
-i
opsi. Ini adalah perbaikan untuk itu:sumber
FYI, jika Anda ingin mencetak semua file dalam multi-line, Anda dapat melakukan
ls -1
yang akan mencetak setiap file dalam baris terpisah. file1 file2 file3sumber
Daftar sederhana dari direktori saat ini, itu akan menjadi:
Apakah Anda ingin disortir dan dibersihkan?
sumber
Coba yang ini. Ini bekerja untuk semua distro linux.
sumber
ls -l | grep '^d' | awk '{print $9}'
One-liner ke daftar direktori hanya dari "sini".
Dengan jumlah file.
sumber
Saya sebagian terpecahkan dengan:
Nah, ini dikurangi untuk saya, bagian walikota :)
sumber
Menambahkan untuk menjadikannya lingkaran penuh, untuk mengambil jalur setiap folder, gunakan kombinasi jawaban Albert dan Gordans yang seharusnya cukup berguna.
Keluaran:
sumber
Menggunakan Perl:
sumber
Inilah yang saya gunakan untuk mendaftar hanya nama direktori:
sumber
Untuk menjawab pertanyaan awal,
*/
tidak ada hubungannya denganls
per se; itu dilakukan oleh shell / Bash, dalam proses yang dikenal sebagai globbing .Inilah sebabnya
echo */
danls -d */
menampilkan elemen yang sama. (-d
Bendera membuatls
keluaran nama direktori dan bukan isi direktori.)sumber
Berikut adalah variasi menggunakan pohon yang menampilkan nama direktori hanya pada baris terpisah, ya itu jelek tapi hei, itu berfungsi.
atau dengan awk
Ini mungkin lebih baik namun dan akan mempertahankan
/
nama direktori setelah.sumber
O / P (Di mesin saya) -
Output di atas dapat lebih disempurnakan dengan menggunakan cut.
sumber
Perintah terpendek yang pernah (sebenarnya peretasan) untuk daftar direktori saja. Ketikkan jalur absolut atau jalur relatif dari direktori yang diminati dan tekan enter untuk masuk ke direktori yang diminati. Sekarang ketik
cd
dan tekan tombol tab . Hanya direktori yang ditampilkan sekarang.user@ubuntu:~/Desktop$cd <tab key>
Perintah di atas seharusnya sekarang hanya menampilkan folder di Desktop . Memang terpendek.
sumber