Apakah ada cara yang benar untuk mendaftar subdirektori dari direktori saat ini?

10

Saya dapat menemukan subdirektori dari suatu direktori dengan

ls -d -- */

atau

ls -l | grep "^d"

tetapi keduanya tampaknya tidak langsung, dan saya akan membayangkan bahwa akan ada cara standar untuk menemukan direktori saja. Apakah ada cara yang tepat untuk melakukan ini? Dan jika tidak, akankah salah satu dari ini mengarah pada perilaku yang tidak diinginkan pada kasus tepi? (Tautan simbolik, direktori tersembunyi, dll.)

Eric Wilson
sumber

Jawaban:

17

Jawabannya akan lebih tergantung pada apa yang ingin Anda lakukan dengan output daripada pada apa yang Anda cari. Jika Anda hanya ingin melihat daftar untuk referensi visual di terminal, solusi pertama Anda sebenarnya cukup bagus. Jika Anda ingin memproses output Anda harus mempertimbangkan untuk menggunakan metode lain.

Salah satu cara paling kuat untuk mendapatkan daftar untuk dimasukkan ke dalam program lain adalah dengan menggunakannya find.

find -maxdepth 1 -type d

Alasan ini baik untuk umpan adalah bahwa finddapat menampilkan data yang dipisahkan oleh nol menggunakan -print0atau dengan benar melarikan diri string sebagai argumen untuk menggunakan program lain -exec. Untuk referensi tentang mengapa ini lebih baik daripada mem-parsing output ls, lihat ParsingLS di Greg's Wiki.

Caleb
sumber
4
Saya harus mengetik find . -maxdepth 1 -type dagar ini berfungsi pada OS X Yosemite.
Sean Levin
1
untuk mendaftar sub-direktori, kita harus menentukan -mindepth seperti pada find . -maxdepth 1 -mindepth 1 -type d. Kalau tidak, direktori saat ini .akan dimasukkan.
tinlyx
5

FYI - Di ZSH (tapi bukan BASH), Anda juga bisa melakukan ini ls -d -- *(/):; yang (/)pengubah memberitahu zsh hanya untuk direktori gumpal.

Yang mengatakan, itu tidak jauh berbeda dari solusi yang Anda usulkan ( ls -d -- */), dan itu jauh dari standar.

Sejauh output dari ls(yang mungkin berbeda berdasarkan pada flag lain):

% ls
dir0 dir1 dir2 file0 file1 file2
% ls -d -- */
dir0/ dir1/ dir2/
% ls -d -- *(/)
dir0 dir1 dir2
Curtis F.
sumber
zsh memperluas tanda bintang ke semua file dan direktori, bendera (/) memilih bagian dari ekspansi itu sehingga ls * (/) juga berfungsi, serta gema * (/) , atau cara yang lebih zshly mencetak -l * (/ ) . Dua versi pertama juga bekerja di bash.
Thor
1
Perhatikan bahwa *(/)memperluas ke direktori yang tidak disembunyikan sementara */memperluas ke direktori yang tidak disembunyikan atau symlink ke direktori (atau setidaknya symlink ke jalur yang kita tahu bahwa mereka adalah direktori).
Stéphane Chazelas