it-swarm.asia

Bagaimana cara mendapatkan ukuran direktori Linux atau Mac OS X dari baris perintah?

Perintah apa yang saya gunakan untuk menemukan ukuran semua file (secara rekursif) di direktori Linux atau Mac OS X?

71
Daryl Spitzer

Versi BSD dari du yang digunakan dalam OS X melaporkan ukuran dengan blok 512-byte - ukuran pada dasarnya dibulatkan ke nilai 512-byte berikutnya. Ini memberi tahu Anda ruang pada disk, yang lebih besar dari jumlah data. Jika Anda memiliki banyak file kecil, perbedaannya bisa besar.

Ini sebuah contoh.

Ini adalah nilai dengan du reguler. Ada dalam blok 512-byte:

$ du -s
248   .

Bendera -h menghasilkan angka yang lebih mudah dibaca, dalam kilobyte. Seperti yang diharapkan, itu setengah dari jumlah blok 512-byte:

$ du -hs
124K  .

Akhirnya, Anda dapat menggunakan find dan awk untuk memberikan Anda jumlah byte aktual dalam file. Ini agak lambat, tetapi berhasil:

$ find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
60527

Nilai ini sama persis dengan angka yang dilaporkan oleh jendela Find Info Get. (Tidak ada fork atau xattr aneh dalam set file ini.) Secara signifikan lebih kecil dari nilai yang dilaporkan oleh du.

Begini cara kerjanya: mendapat daftar semua file, dan meneruskannya ke ls -l; lalu awk digunakan untuk menghitung byte. Bendera -type f ada sehingga hanya file (dan bukan direktori) yang dikirim ke ls. Tanpa bendera itu, itu juga akan mengirim nama direktori ke ls, dan setiap file akan terdaftar dua kali: sekali sebagai file individual, dan sekali sebagai item dalam direktori.

Versi GNU dari du dapat memberikan nilai dalam byte aktual alih-alih blok. Sangat disayangkan bahwa versi BSD dari du tidak fleksibel.

79
wch

Tampilkan ukuran satu file

du -h path_to_a_file

Tampilkan ukuran isi direktori, setiap sub-direktori, dan setiap file individual:

du -h path_to_a_directory

Tampilkan ukuran isi direktori:

du -sh path_to_a_directory

75
Daryl Spitzer

du - memberi tahu penggunaan disk bukan ukuran file .

find . -type f -print0 | xargs -0 stat -f%z | awk '{b+=$1} END {print b}'

kode terminal di atas (im pada osx 10.6) menawarkan bagi saya hasil terbaik dan lebih cepat daripada "find ... -exec"

patokan cepat

time find . -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}'
4744010970

real    0m0.086s
user    0m0.029s
sys 0m0.073s

time find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
4744010970

real    0m18.515s
user    0m2.929s
sys 0m9.339s
9
Acid

Anda dapat menggunakan du -ah . yang menampilkan ukuran semua file dan direktori secara rekursif.

Ini dapat dikombinasikan dengan sort, sehingga Anda akan melihat 20 direktori terbesar di folder saat ini:

du -ah . | sort -rh | head -20

Catatan: Opsi -h untuk sort tidak tersedia di OSX/BSD, jadi Anda harus menginstal sort dari coreutils (mis. Via brew) dan menerapkan path bin ke PATH, mis.

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.

Kalau tidak gunakan:

du -a . | sort -rn | head -20
5
kenorb

Saya menggabungkan semua persetujuan Anda dan menggabungkannya dengan output yang dapat dibaca manusia, hasilnya adalah:

#!/bin/sh
find $1 -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}' | awk '{ sum=$1 ; hum[1024**3]="Gb";hum[1024**2]="Mb";hum[1024]="Kb"; for (x=1024**3; x>=1024; x/=1024){ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x];break } }}'

Tautan ke Gist: https://Gist.github.com/mlegenhausen/9365461

2
malte