Penghitungan file secara rekursif dalam direktori Linux


728

Bagaimana saya bisa menghitung file dalam direktori Linux secara rekursif?

Aku menemukan ini:

find DIR_NAME -type f ¦ wc -l

Tetapi ketika saya menjalankan ini mengembalikan kesalahan berikut.

find: path harus mendahului ekspresi: ¦


64
Anda mengacaukan bilah yang rusak ¦(ASCII 166) dengan bilah vertikal |(ASCII 124) yang digunakan untuk pipa UNIX .
Skippy le Grand Gourou

7
@ SkippyleGrandGourou Bukankah itu disebut pipa?
DaveStephens

27
@ DaveStephens Ya, itu juga disebut itu. Ini juga disebut stroke Sheffer, bar vertikal, vbar, tongkat, garis vertikal, garis miring vertikal, batang, obelisk, glidus.
emlai

64
@zen Dengan begitu saya sebut saja Bob.
Christopher

15
Dalam RFC20 itu disebut "garis vertikal". "Pipa" adalah nama operator shell, bukan nama simbol. Sama seperti *karakter ASCII "tanda bintang", tetapi "waktu" dalam beberapa konteks lain.
langsing

Jawaban:


1327

Ini seharusnya bekerja:

find DIR_NAME -type f | wc -l

Penjelasan:

  • -type f untuk hanya menyertakan file.
  • |( dan tidak¦ ) mengarahkan findoutput standar wcperintah ke input standar perintah.
  • wc(kependekan dari jumlah kata) menghitung baris baru, kata dan byte pada inputnya ( dokumen ).
  • -l hanya menghitung baris baru.

Catatan:

  • Ganti DIR_NAMEdengan .untuk mengeksekusi perintah di folder saat ini.
  • Anda juga dapat menghapus -type funtuk memasukkan direktori (dan symlink) dalam hitungan.
  • Mungkin perintah ini akan menghitung berlebihan jika nama file dapat berisi karakter baris baru.

Penjelasan mengapa contoh Anda tidak berfungsi:

Pada perintah yang Anda tunjukkan, Anda tidak menggunakan "Pipa" ( |) untuk menghubungkan dua perintah, tetapi bilah yang rusak ( ¦) yang shell tidak kenali sebagai perintah atau yang serupa. Itu sebabnya Anda mendapatkan pesan kesalahan itu.


27
The fdalam -type fsingkatan file dan wc -luntuk jalur jumlah kata.
Serge Stroobandt

3
Hapus -type funtuk memasukkan direktori dalam hitungan
phatblat

3
Tidak perlu untuk -printbendera
Zoltán

3
Jika ada kemungkinan nama file berisi karakter baris baru Anda mungkin ingin menggunakan -print0bendera.
gaboroncancio

2
@ gaboroncancio Itu tidak akan membantu, kecuali beberapa implementasi wcmemiliki opsi untuk membaca daftar nol yang dihentikan. Lihat jawaban saya untuk alternatif.
Pasang kembali Monica,

100

Untuk direktori saat ini:

find -type f | wc -l

5
Solusi ini tidak mempertimbangkan nama file yang mengandung baris baru.
Kusalananda

2
Untuk direktori saat ini, Anda bahkan tidak perlu.
baptx

1
Sebenarnya, pada beberapa platform, Anda jangan perlu mengejafind .
tripleee

1
@ Kusalanandra Komentar Anda berlaku untuk hampir setiap jawaban di sini.
tripleee

69

Jika Anda ingin rincian berapa banyak file dalam setiap dir di bawah dir Anda saat ini:

for i in */ .*/ ; do 
    echo -n $i": " ; 
    (find "$i" -type f | wc -l) ; 
done

Itu bisa dilakukan semua dalam satu baris, tentu saja. Tanda kurung mengklarifikasi keluaran siapa wc -lyang seharusnya ditonton ( find $i -type fdalam hal ini).


7
Itu bisa macet di direktori dengan spasi di namanya. Mengubah baris pertama untuk find . -maxdepth 1 -type d -print0 | while IFS= read -r -d '' i ; domemperbaikinya. Lihat Bagaimana saya bisa membaca file (aliran data, variabel) baris demi baris (dan / atau bidang-demi-bidang)?
Arch Stanton

4
Menggunakan finduntuk loop luar hanyalah komplikasi yang tidak perlu. for i in */; do`
tripleee

function countit {for i in $ (find. -maxdepth 1 -type d); do file_count = $ (temukan $ i -type f | wc -l); echo "$ file_count: $ i"; selesai}; countit | sort -n -r
Schneems

Akhirnya inilah yang saya butuhkan. Folder saya memiliki ribuan file sehingga mencetaknya dengan pohon atau apa pun bukan pilihan
lesolorzanov

Ini termasuk ../ dan sepertinya tidak maju - artinya tidak regresif.
Daniel Lefebvre

50

Kamu bisa menggunakan

$ tree

setelah menginstal paket tree dengan

$ sudo apt-get install tree

(pada mesin Linux Debian / Mint / Ubuntu).

Perintah tidak hanya menampilkan jumlah file, tetapi juga jumlah direktori, secara terpisah. Opsi -L dapat digunakan untuk menentukan tingkat tampilan maksimum (yang, secara default, adalah kedalaman maksimum pohon direktori).

File tersembunyi juga dapat disertakan dengan menyediakan -aopsi.


4
Ini sebenarnya adalah cara paling sederhana untuk melihat sejumlah direktori dan file.
Lorem Ipsum Dolor

11
Dari halaman manual: Secara default tree tidak mencetak file tersembunyi . Anda harus menyediakan -aopsi untuk memasukkannya.
eee

3
Untuk menginstal ini di macOS, gunakan brewdan jalankan brew install tree, lebih disukai setelah berjalan brew update.
Ashish Ahuja

4
Ini juga mencetak semua nama file, jadi akan lambat jika Anda memiliki banyak file.
Franck Dernoncourt

2
Wow, alat yang sangat bagus, dapat mencetak folder berwarna, hanya daftar folder, keluaran sebagai JSON. Ini dapat mendaftar folder 34k dan file 51k dalam beberapa detik. Olé!
brasofilo

46

Di komputer saya, rsyncsedikit lebih cepat daripada find | wc -ldi jawaban yang diterima:

$ rsync --stats --dry-run -ax /path/to/dir /tmp

Number of files: 173076
Number of files transferred: 150481
Total file size: 8414946241 bytes
Total transferred file size: 8414932602 bytes

Baris kedua memiliki jumlah file, 150.481 dalam contoh di atas. Sebagai bonus, Anda mendapatkan ukuran total juga (dalam byte).

Catatan:

  • baris pertama adalah hitungan file, direktori, symlink, dll semuanya, itu sebabnya lebih besar dari baris kedua.
  • opsi --dry-run(atau -nsingkatnya) penting untuk tidak benar-benar mentransfer file!
  • Saya menggunakan -xopsi untuk "jangan melewati batas filesystem", yang berarti jika Anda menjalankannya /dan Anda memiliki hard disk eksternal yang terpasang, itu hanya akan menghitung file pada partisi root.

Saya suka ide Anda menggunakan rsync di sini. Saya tidak akan pernah memikirkannya!
Qeole

Terima kasih @ Quole, idenya bukan milikku. Saya membacanya beberapa tahun yang lalu di suatu tempat bahwa rsync adalah yang tercepat untuk menghapus folder dengan banyak file dan subfolder, jadi saya pikir mungkin lebih cepat untuk menghitung file juga.
psmith

1
Sudah mencoba ini. Setelah menjalankan keduanya dua kali sebelumnya untuk mengisi cache fs, find ~ -type f | wc -lbutuh 1,7 / 0,5 / 1,33 detik (real / user / sys). rsync --stats --dry-run -ax ~ /xxxbutuh 4,4 / 3,1 / 2,1 detik. Itu untuk sekitar 500.000 file pada SSD.
langsing

Entah versi rsync apa yang Anda gunakan, tetapi dalam 3.1.2 ini sedikit lebih mudah dibaca:Number of files: 487 (reg: 295, dir: 192)
mpen

Saya menggunakan rsync default di macOS:rsync version 2.6.9 protocol version 29
psmith

20

Karena nama file di UNIX dapat berisi baris baru (ya, baris baru), wc -l mungkin menghitung terlalu banyak file. Saya akan mencetak titik untuk setiap file dan kemudian menghitung titik:

find DIR_NAME -type f -printf "." | wc -c

1
Sepertinya ini adalah satu-satunya solusi yang menangani file dengan baris baru di namanya. Terpilih.
codeforester

2
hihi :) Saya suka baris baru dalam nama file. Itu membuat mereka lebih mudah dibaca.
hek2mgl

Maksud saya, baris baru dalam nama file bukan konten!
codeforester

1
Saya hanya bercanda ... Ya, baris baru dalam nama file selalu harus diperhitungkan. Mereka bisa berasal dari konten jahat atau kurang spektakuler, dari kesalahan ketik.
hek2mgl

18

Menggabungkan beberapa jawaban di sini bersama-sama, solusi yang paling berguna tampaknya adalah:

find . -maxdepth 1 -type d -print0 |
xargs -0 -I {} sh -c 'echo -e $(find "{}" -printf "\n" | wc -l) "{}"' |
sort -n

Ini dapat menangani hal-hal aneh seperti nama file yang menyertakan kurung spasi dan bahkan baris baru. Ini juga mengurutkan output berdasarkan jumlah file.

Anda dapat menambah jumlahnya setelah -maxdepthmendapatkan sub direktori yang dihitung juga. Perlu diingat bahwa ini berpotensi memakan waktu lama, terutama jika Anda memiliki struktur direktori yang sangat bersarang dalam kombinasi dengan angka yang tinggi -maxdepth.


Ada apa dengan ini echo -e? Saya kira Anda memasukkannya ke dalam untuk melipat baris baru, tetapi juga akan memotong-motong spasi putih tidak teratur lainnya, dan mencoba untuk memperluas karakter wildcard yang ada di kata demi kata dalam nama file. Saya akan pergi dengan sesuatu seperti find .* * -type d -execdir sh -c 'find . -type f -printf "\n" | wc -l; pwd'dan hidup dengan penyimpangan dalam output, atau mungkin bermain dengan Bash printf "%q"untuk mencetak nama direktori.
tripleee

10

Jika Anda ingin tahu berapa banyak file dan sub-direktori dari direktori kerja ini, Anda dapat menggunakan one-liner ini

find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find {} | wc -l) {}' | sort -n

Ini akan berfungsi dalam GNU flavor, dan hanya menghilangkan -e dari perintah echo untuk BSD linux (misalnya OSX).


2
Solusi yang sangat baik! Satu-satunya masalah yang saya temukan adalah direktori dengan spasi atau karakter khusus. Tambahkan kutipan di mana nama dir digunakan:find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find "{}" | wc -l) "{}"' | sort -n
John Kary

1
Saya telah memodifikasinya sedikit dan berfungsi dengan baik untuk saya:find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo $(find {} | wc -l) \\t {}' | sort -rn | less
Wizek

Komentar saya pada jawaban @ Sebastian juga berlaku di sini. Penggunaan echo -e(atau hanya `echo` seperti dalam komentar sebelumnya) pada nama direktori yang tidak dikutip memperdagangkan satu masalah dengan yang lain.
tripleee

8

Jika Anda ingin menghindari kasus kesalahan, jangan izinkan wc -lmelihat file dengan baris baru (yang akan dihitung sebagai 2+ file)

mis. Pertimbangkan kasus di mana kita memiliki satu file dengan karakter EOL tunggal di dalamnya

> mkdir emptydir && cd emptydir
> touch $'file with EOL(\n) character in it'
> find -type f
./file with EOL(?) character in it
> find -type f | wc -l
2

Karena setidaknya gnu wctampaknya tidak memiliki opsi untuk membaca / menghitung daftar nol yang dihentikan (kecuali dari file), solusi termudah adalah dengan tidak memberikannya nama file, tetapi output statis setiap kali file ditemukan, misalnya dalam direktori yang sama seperti di atas

> find -type f -exec printf '\n' \; | wc -l
1

Atau jika Anda findmendukungnya

> find -type f -printf '\n' | wc -l
1 

7

Anda bisa menggunakan perintah ncdu. Ini akan secara rekursif menghitung berapa banyak file yang berisi direktori Linux. Ini adalah contoh dari output:

masukkan deskripsi gambar di sini

Ini memiliki bilah kemajuan, yang nyaman jika Anda memiliki banyak file:

masukkan deskripsi gambar di sini

Untuk menginstalnya di Ubuntu:

sudo apt-get install -y ncdu

Benchmark: Saya menggunakan https://archive.org/details/cv_corpus_v1.tar (380390 file, 11 GB) sebagai folder di mana seseorang harus menghitung jumlah file.

  • find . -type f | wc -l: sekitar 1m20s untuk menyelesaikan
  • ncdu: sekitar 1m20s untuk menyelesaikan

Itu terutama menghitung penggunaan disk, bukan jumlah file. Overhead tambahan ini kemungkinan tidak diinginkan. (Selain itu perlu menginstal paket tambahan untuk sesuatu yang dapat dilakukan dengan utilitas POSIX standar)
hek2mgl

@ hek2mgl Ini menghitung jumlah file, seperti yang ditunjukkan dengan warna merah di tangkapan layar pertama. Butuh beberapa menit untuk ~ 2 juta file, jadi kecepatannya tidak terlalu buruk.
Franck Dernoncourt

2
@ hek2mgl Saya menambahkan tolok ukur yang dapat direproduksi dalam jawabannya, saya menjalankannya dua kali dan saya tidak melihat perbedaan antara find . -type f | wc -ldan ncdu.
Franck Dernoncourt

2
ya, sepertinya findada di bawah tenda menjalankan lebih atau kurang panggilan sistem yang sama dengan duyang merupakan backend untuk ncdu. Baru saja mengikat mereka.
hek2mgl

1
@ FranckDernoncourt menyukainya. Saya punya banyak file dalam folder dan memiliki progress bar adalah penyelamat. Terima kasih telah berbagi!
Geek


4

Untuk menentukan berapa banyak file yang ada di direktori saat ini, masukkan ls -1 | wc -l. Ini digunakan wcuntuk melakukan hitungan jumlah baris (-l)dalam output ls -1. Itu tidak menghitung dotfile. Harap dicatat bahwals -l (itu "L" daripada "1" seperti pada contoh sebelumnya) yang saya gunakan dalam versi HOWTO ini sebelumnya akan benar-benar memberi Anda jumlah file yang lebih besar dari jumlah sebenarnya. Terima kasih kepada Kam Nejad untuk poin ini.

Jika Anda hanya ingin menghitung file dan TIDAK menyertakan tautan simbolik (hanya contoh apa yang bisa Anda lakukan), Anda bisa menggunakan ls -l | grep -v ^l | wc -l(itu "L" bukan "1" kali ini, kami ingin daftar "panjang" di sini) . grepmemeriksa baris yang dimulai dengan "l" (menunjukkan tautan), dan membuang baris itu (-v).

Kecepatan relatif: "ls -1 / usr / bin / | wc -l" membutuhkan waktu sekitar 1,03 detik pada 486SX25 yang tidak dimuat (/ usr / bin / pada mesin ini memiliki 355 file). "ls -l /usr/bin/ | grep -v ^l | wc -l " membutuhkan waktu sekitar 1,19 detik.

Sumber: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html


2
ls -lharus melakukan statsyscall pada setiap file untuk membaca ukurannya, mtime dan properti lainnya, yang lambat. Pada direktori besar (100.000+ file) menjalankan ls -ldapat memakan waktu beberapa menit. Jadi untuk hanya menghitung file, selalu gunakan ls -1 | wc -l.
Marki555

A 486SX25, bagus
cam8001

ls -1masih bisa lambat di direktori besar, karena harus mengurutkan file. Cukup printf '%s\n' *melakukan hal yang sama, dan menghindari lspanggilan eksternal (yang bermasalah bagaimanapun) tetapi soluton yang paling efisien adalah dengan menggunakan perintah yang tidak melakukan penyortiran, seperti find. (Output glob diurutkan berdasarkan shell.)
tripleee

4

Jika yang Anda butuhkan adalah menghitung jenis file tertentu secara rekursif , Anda dapat melakukannya:

find YOUR_PATH -name '*.html' -type f | wc -l 

-l hanya untuk menampilkan jumlah baris dalam output.


Ekstensi adalah bagian dari nama file dan mungkin tidak mewakili file TYPE
Waxhead

4

Dengan bash:

Buat larik entri dengan () dan dapatkan hitungan dengan #.

FILES=(./*); echo ${#FILES[@]}

Ok itu tidak menghitung file secara rekursif tapi saya ingin menunjukkan opsi sederhana terlebih dahulu. Kasus penggunaan umum mungkin untuk membuat cadangan rollover file. Ini akan membuat logfile.1, logfile.2, logfile.3 dll.

CNT=(./logfile*); mv logfile logfile.${#CNT[@]}

Hitungan rekursif dengan bash 4+ globstardiaktifkan (seperti yang disebutkan oleh @tripleee)

FILES=(**/*); echo ${#FILES[@]}

Untuk mendapatkan jumlah file secara rekursif kita masih bisa menggunakan find dengan cara yang sama.

FILES=(`find . -type f`); echo ${#FILES[@]}

Kerang modern mendukung **/*penghitungan rekursif. Ini masih kurang efisien daripada finddi direktori besar karena shell harus mengurutkan file di setiap direktori.
tripleee

2

Untuk direktori dengan spasi pada namanya ... (berdasarkan berbagai jawaban di atas) - cetak nama direktori secara rekursif dengan jumlah file di dalamnya:

find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done

Contoh (diformat untuk dibaca):

pwd
  /mnt/Vancouver/Programming/scripts/claws/corpus

ls -l
  total 8
  drwxr-xr-x 2 victoria victoria 4096 Mar 28 15:02 'Catabolism - Autophagy; Phagosomes; Mitophagy'
  drwxr-xr-x 3 victoria victoria 4096 Mar 29 16:04 'Catabolism - Lysosomes'

ls 'Catabolism - Autophagy; Phagosomes; Mitophagy'/ | wc -l
  138

## 2 dir (one with 28 files; other with 1 file):
ls 'Catabolism - Lysosomes'/ | wc -l
  29

Struktur direktori lebih baik divisualisasikan menggunakan tree:

tree -L 3 -F .
  .
  ├── Catabolism - Autophagy; Phagosomes; Mitophagy/
  │   ├── 1
  │   ├── 10
  │   ├── [ ... SNIP! (138 files, total) ... ]
  │   ├── 98
  │   └── 99
  └── Catabolism - Lysosomes/
      ├── 1
      ├── 10
      ├── [ ... SNIP! (28 files, total) ... ]
      ├── 8
      ├── 9
      └── aaa/
          └── bbb

  3 directories, 167 files

man find | grep mindep
  -mindepth levels
    Do not apply any tests or actions at levels less than levels
    (a non-negative integer).  -mindepth 1 means process all files
    except the starting-points.

ls -p | grep -v /(Digunakan di bawah) berasal dari jawaban 2 di /unix/48492/list-only-regular-files-but-not-directories-in-current-directory

find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done
./Catabolism - Autophagy; Phagosomes; Mitophagy: 138
./Catabolism - Lysosomes: 28
./Catabolism - Lysosomes/aaa: 1

Applcation: Saya ingin mencari jumlah file maksimum di antara beberapa ratus direktori (all depth = 1) [output di bawah ini diformat lagi untuk dibaca]:

date; pwd
    Fri Mar 29 20:08:08 PDT 2019
    /home/victoria/Mail/2_RESEARCH - NEWS

time find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done > ../../aaa
    0:00.03

[victoria@victoria 2_RESEARCH - NEWS]$ head -n5 ../../aaa
    ./RNA - Exosomes: 26
    ./Cellular Signaling - Receptors: 213
    ./Catabolism - Autophagy; Phagosomes; Mitophagy: 138
    ./Stress - Physiological, Cellular - General: 261
    ./Ancient DNA; Ancient Protein: 34

[victoria@victoria 2_RESEARCH - NEWS]$ sed -r 's/(^.*): ([0-9]{1,8}$)/\2: \1/g' ../../aaa | sort -V | (head; echo ''; tail)

    0: ./Genomics - Gene Drive
    1: ./Causality; Causal Relationships
    1: ./Cloning
    1: ./GenMAPP 2
    1: ./Pathway Interaction Database
    1: ./Wasps
    2: ./Cellular Signaling - Ras-MAPK Pathway
    2: ./Cell Death - Ferroptosis
    2: ./Diet - Apples
    2: ./Environment - Waste Management

    988: ./Genomics - PPM (Personalized & Precision Medicine)
    1113: ./Microbes - Pathogens, Parasites
    1418: ./Health - Female
    1420: ./Immunity, Inflammation - General
    1522: ./Science, Research - Miscellaneous
    1797: ./Genomics
    1910: ./Neuroscience, Neurobiology
    2740: ./Genomics - Functional
    3943: ./Cancer
    4375: ./Health - Disease 

sort -Vadalah jenis alami. ... Jadi, jumlah maksimum file saya di salah satu direktori (Claws Mail) itu adalah 4.375 file. Jika saya meninggalkan-pad ( https://stackoverflow.com/a/55409116/1904943 ) nama-nama file - mereka semua dinamai secara numerik, dimulai dengan 1, di setiap direktori - dan pad hingga 5 digit total, saya harus baik-baik saja .


Tambahan

Temukan jumlah total file, subdirektori dalam direktori.

$ date; pwd
Tue 14 May 2019 04:08:31 PM PDT
/home/victoria/Mail/2_RESEARCH - NEWS

$ ls | head; echo; ls | tail
Acoustics
Ageing
Ageing - Calorie (Dietary) Restriction
Ageing - Senescence
Agriculture, Aquaculture, Fisheries
Ancient DNA; Ancient Protein
Anthropology, Archaeology
Ants
Archaeology
ARO-Relevant Literature, News

Transcriptome - CAGE
Transcriptome - FISSEQ
Transcriptome - RNA-seq
Translational Science, Medicine
Transposons
USACEHR-Relevant Literature
Vaccines
Vision, Eyes, Sight
Wasps
Women in Science, Medicine

$ find . -type f | wc -l
70214    ## files

$ find . -type d | wc -l
417      ## subdirectories

1

Saya telah menulis ffcnt untuk mempercepat penghitungan file rekursif dalam keadaan tertentu: disk rotasi dan sistem file yang mendukung pemetaan luas.

Ini bisa menjadi urutan besarnya lebih cepat dari lsatau findberdasarkan pendekatan, tetapi YMMV.


0

Ada banyak jawaban yang benar di sini. Ini yang lain!

find . -type f | sort | uniq -w 10 -c

di mana .folder untuk melihat dan 10adalah jumlah karakter yang digunakan untuk mengelompokkan direktori.


-1

temukan -type f | wc -l

ATAU (Jika direktori adalah direktori saat ini)

Temukan . -type f | wc -l


Ini menggandakan setidaknya satu jawaban lain untuk pertanyaan yang sama ini.
Kusalananda

-1

Ini akan bekerja dengan baik. Sederhana pendek. Jika Anda ingin menghitung jumlah file yang ada dalam folder.

ls | wc -l

3
Pertama-tama, ini tidak menjawab pertanyaan. Pertanyaannya adalah tentang penghitungan file secara rekursif dari direktori maju dan perintah yang Anda tunjukkan tidak melakukannya. selanjutnya, dengan ls Anda menghitung direktori serta file. Juga, tidak ada alasan untuk menjawab pertanyaan lama jika Anda tidak akan menambahkan sesuatu yang baru dan bahkan tidak akan membaca pertanyaan dengan benar. Harap jangan melakukannya.
XFCC

-1

Pendekatan alternatif dengan pemfilteran untuk format ini menghitung semua modul kernel grub yang tersedia:

ls -l /boot/grub/*.mod | wc -l

-3
ls -l | grep -e -x -e -dr | wc -l 
  1. Daftar panjang
  2. filter file dan dir
  3. hitung garis yang difilter no
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.