Jawaban:
Anda dapat gunakan:
ls -d -- */
Karena semua direktori berakhir /
, ini hanya daftar direktori di jalur saat ini. The -d Memastikan opsi itu hanya nama direktori dicetak, bukan isinya.
ls -d -- */
dan ls -d */
?
--
secara konvensional digunakan untuk menandai akhir opsi, sehingga jika sebuah file bernama -l
ls tidak akan menafsirkannya sebagai opsi format daftar panjang.
Tanggapan Stephen Martin memberi peringatan, dan membuat daftar folder saat ini juga, jadi saya sarankan
find . -mindepth 1 -maxdepth 1 -type d
(Ini di Linux; Saya tidak dapat menemukan -maxdepth dan -mindepth di halaman manual POSIX untuk menemukan)
ls -d -- */
pilihannya, karena find
akan menemukan directorty tersembunyi juga. Yang kadang-kadang bisa bermanfaat, tetapi juga terkadang menyebabkan masalah. Saya harap komentar ini dapat membantu orang lain. +1
Jawaban Daniel benar. Berikut adalah beberapa tambahan yang bermanfaat.
Untuk menghindari daftar folder tersembunyi (seperti .git
), coba ini:
find . -mindepth 1 -maxdepth 1 -type d \( ! -iname ".*" \)
Dan untuk mengganti dot slash yang ditakuti di awal find
output di beberapa lingkungan, gunakan ini:
find . -mindepth 1 -maxdepth 1 -type d \( ! -iname ".*" \) | sed 's|^\./||g'
Anda "tidak seharusnya" mem-parsing output ls, atau begitulah yang dikatakan. Alasan di balik adalah bahwa output dimaksudkan agar dapat dibaca oleh manusia dan yang dapat membuatnya tidak perlu rumit untuk diuraikan, jika saya ingat.
jika Anda tidak ingin ls atau temukan, Anda mungkin ingin mencoba memfilter "*" dengan "[-d]".
Saya melakukan hal itu, untuk beberapa alasan ls dan menemukan tidak berfungsi (file name dengan spasi dan kurung kurasa, atau sesuatu yang saya menghadap), maka saya melakukan sesuatu di sepanjang baris
for f in * ; do [ -d "$f" ] && echo $f is indeed a folder ; done
Hanya untuk menekankan hal yang membingungkan saya di sini, sehubungan dengan pemilihan pola glob; katakan Anda memiliki ini:
$ cd /tmp
$ mkdir testglob
$ for ix in {00,01,02,03} ; do mkdir testglob/mydir_${ix} ; done
$ for ix in {00,01,02,03} ; do touch testglob/myfile_${ix} ; done
$ for ix in {00,01,02,03} ; do touch testglob/mydir_${ix}.txt ; done
$ for ix in {00,01,02,03} ; do mkdir testglob/otherdir_${ix} ; done
$ tree testglob/
testglob/
├── mydir_00
├── mydir_00.txt
├── mydir_01
├── mydir_01.txt
├── mydir_02
├── mydir_02.txt
├── mydir_03
├── mydir_03.txt
├── myfile_00
├── myfile_01
├── myfile_02
├── myfile_03
├── otherdir_00
├── otherdir_01
├── otherdir_02
└── otherdir_03
8 directories, 8 files
Jadi, katakan di sini Anda hanya ingin memilih mydir*
direktori. Perhatikan bahwa jika Anda meninggalkan slash penghentian, ls -d
akan mencantumkan file juga:
$ ls -d testglob/mydir* # also `ls -d -- testglob/mydir*`
testglob/mydir_00 testglob/mydir_01 testglob/mydir_02 testglob/mydir_03
testglob/mydir_00.txt testglob/mydir_01.txt testglob/mydir_02.txt testglob/mydir_03.txt
... namun, dengan slash penghentian, maka hanya direktori yang terdaftar:
$ ls -d testglob/mydir*/ # also `ls -d -- testglob/mydir*/`
testglob/mydir_00/ testglob/mydir_01/ testglob/mydir_02/ testglob/mydir_03/
printf "%s\n" */
akan mencantumkan semua direktori di $ PWD.
echo */
juga akan bekerja, tetapi dalam satu baris panjang, lebih sulit ketika nama memiliki spasi.
Anda juga bisa menggunakan:
du
Atau:
git ls-tree -d -r --name-only @