Bagaimana cara membuat daftar folder menggunakan perintah bash?


52

Apakah ada cara untuk mendaftar hanya folder dalam direktori menggunakan perintah bash? (sebagai lsperintah mencantumkan semua file dan folder)

Jawaban:


66

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.


2
ls - * / daftar semua direktori dengan isinya di bawah ini
Vins

2
@ 8088 Apa perbedaan antara ls -d -- */dan ls -d */?
Louis

5
@ Louis, --secara konvensional digunakan untuk menandai akhir opsi, sehingga jika sebuah file bernama -lls tidak akan menafsirkannya sebagai opsi format daftar panjang.
Cristian Ciupitu

29

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)


1
Pertanyaan lama yang saya tahu. Meskipun pada awalnya saya akan beralih untuk mencari tugas ini, saya suka ls -d -- */pilihannya, karena findakan menemukan directorty tersembunyi juga. Yang kadang-kadang bisa bermanfaat, tetapi juga terkadang menyebabkan masalah. Saya harap komentar ini dapat membantu orang lain. +1
cocok

12
find . -maxdepth 1 -type d

Akan daftar hanya folder. Dan seperti yang ditunjukkan Teddy, Anda perlu -maxdepth untuk menghentikannya kembali menjadi sub dir


5
Anda mungkin ingin -maxdepth 1juga.
Teddy

6

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 findoutput di beberapa lingkungan, gunakan ini:

find . -mindepth 1 -maxdepth 1 -type d  \( ! -iname ".*" \) | sed 's|^\./||g'

1

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

0

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 -dakan 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/

0

printf "%s\n" */ akan mencantumkan semua direktori di $ PWD.

echo */ juga akan bekerja, tetapi dalam satu baris panjang, lebih sulit ketika nama memiliki spasi.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.