Perbedaan perhitungan ukuran direktori

9

Saya perlu mendapatkan ukuran direktori di terminal untuk tujuan penandatanganan. Saya menggunakan perintah berikut:

du -s /path/to/dir

Saya mengalikan hasilnya dengan ukuran blok UNIX tradisional (512 byte) dan mendapatkan ukuran direktori aktual dalam byte. Namun, jendela dialog "Get Info" dari Finder menunjukkan ukurannya sedikit lebih kecil daripada yang dihitung dengan perintah terminal. Dan tampaknya itu dapat direproduksi pada folder / bundel apa pun. Apa yang saya lewatkan?

Eimantas
sumber

Jawaban:

11

Biasanya, dumenunjukkan informasi tentang penggunaan disk (dari mana namanya berasal). Ingat itu

disk usage != sum of file sizes

Karena setiap file membutuhkan sejumlah blok pada sistem file (lihat man mkfs.ext2misalnya). Ini berarti bahwa hanya dalam situasi yang sangat jarang penggunaan disk pada file sama dengan ukuran sebenarnya - untuk itu, ukurannya harus persis kelipatan dari ukuran blok.

Pikirkan blok sistem file sebagai kotak yang berisi bagian-bagian file - masing-masing dapat berisi bagian dari hanya satu file.

Untuk versi GNU du, periksa --apparent-sizeopsi.


Situasi yang lebih menarik dapat terjadi, ketika ada beberapa file jarang pada sistem file!

rozcietrzewiacz
sumber
Tidak ada opsi seperti itu (saya menggunakan OS X, bukan Linux). Mungkin perlu menyebutkan bahwa dalam sebuah pertanyaan, karena tag tidak cukup.)
Eimantas
Ah, benar ... Kemudian lihat halaman manualnya dan coba cari referensi ke actualatau apparent. (Juga lihat penjelasan saya yang diperbarui).
rozcietrzewiacz
2
Benar kecuali untuk ketidaksetaraan. Ukuran file kadang-kadang mungkin lebih besar dari ruang disk sebenarnya yang diperlukan untuk menyimpannya. ( unix.stackexchange.com/q/33801/9426 )
Stéphane Gimenez
@ StéphaneGimenez Wow ... terima kasih sudah memberi tahu saya!
rozcietrzewiacz
2

Tentang Mac OS X dan Finder (di Snow Leopard, versi 10.6.8) Saya perhatikan berikut ini.

  • Saya mendapatkan jumlah byte untuk angka 'terkuantifikasi' dari path (file atau folder) Finders dengan kode (dalam bash(1)) di bawah ini.
  • Jendela dan panel Finder "Info" menampilkan angka 'terukur' (mis. Kilo dalam KB) dalam bilangan desimal (basis 10, 1000) sebagai lawan dari byte biner (basis 2, 1024) jadi saya 'mengukur' dengan membagi dengan 1000 dan menambah awalan unit (byte) 'quantifier' (magnitude) dan lakukan pembulatan "off key". (Kode lengkap saya penuh dengan kode pengembangan yang tidak dikomentari dan dibagi menjadi beberapa file (dan bahasa) sehingga sulit untuk dibagikan.)
    Sejauh ini saya telah melihat angka 'terkuantifikasi' saya sama dengan angka 'terkuantifikasi' dalam Finder .
  • Juga, bersama dengan kode saya ingin mengatakan bahwa saya tidak memiliki (dan belum pernah) variabel lingkungan BLOCKSIZEditetapkan di shell saya tapi saya diuji (sekarang, sedikit) baik versi dan nilai default untuk $BLOCKSIZEmemberikan nilai yang sama.

#!/usr/bin/env bash
#tab-width:4
                                 du -s                      "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-0512}'   }'||exit $?         #macosx  (xnu)
#                               gdu -sB${BLOCKSIZE:-4096}   "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-4096}'   }'||exit $?         #macports gnu

  • Nomor yang tidak disebutkan saya belum berhasil mencocokkan.
    Satu-satunya hal yang bisa saya katakan adalah bahwa saya semakin dekat dengan hanya menghitung file (dengan demikian tidak termasuk direktori ~ 'file-system meta index / header' ~ data) dan yang paling dekat saya dapatkan adalah dengan yang berikut.

#!/usr/bin/env bash
#tab-width:4
    for a;do find "$a" -type f -print0|xargs -0      stat -f %z         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macosx  (xnu)
#   for a;do find "$a" -type f -print0|xargs -0     gstat -c %s         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macports gnu
  • Baik (xnu) du(1) maupun (gnu) gdu(1) tampaknya menghitung atribut yang diperluas ( xattr)

Dan kemudian aku harus menghukum 'Jalankan jalan dan lakukan matematika'
Damai dan selamat malam untuk kali ini.

Vike
sumber
1

Pada sistem Ubuntu saya, menggunakan ext4, du -b filememberikan ukuran dalam byte file yang sebenarnya, dan du -b dirmemberikan ukuran dalam byte file (s) + overhead direktori, overhead, dalam kasus saya, kelipatan 4096 byte ..

Overhead ini meningkat seiring dengan meningkatnya jumlah file.
Catatan: walaupun file dihapus, overhead direktori tetap berada pada level yang lebih tinggi sebelum flle dihapus ..

Saya belum mencoba me-reboot, untuk melihat apakah itu kembali, tetapi dalam kedua kasus, ini berarti bahwa ukuran direktori bervariasi tergantung pada keadaan historis.

Menghitung setiap ukuran file mungkin merupakan opsi terbaik untuk nilai akurat dari total ukuran file .

Script berikut total semua ukuran file (dalam byte) ..

Untuk OS X, jika Anda tidak memiliki -bopton untuk 'du', Anda dapat menggunakannya statsebagai gantinya. (Jika Anda memilikinya:) ... Baris komentar menunjukkan statalternatif Ubuntu untuk du -b;

unset total
while IFS= read -r -d $'\0' rf; do
  # (( total += $(stat  "$rf" | sed -nre 's/^  Size: ([0-9]+).*/\1/p') ))
    (( total += $(du -b "$rf" | cut -f 1) ))
done < <(find  . -type f  -name '*' -print0)
echo $total
Peter.O
sumber
2
OSX tidak memilikidu -b dan berbedastat . Skrip Anda juga tidak portabel di luar Linux.
Gilles 'SO- stop being evil'
Dengan MacPorts pada OS X Anda dapat menginstal coreutilsuntuk mendapatkan versi GNU dusebagai gdu. Jadi ini tidak sepenuhnya portabel, tetapi mungkin berguna bagi orang-orang di OS X untuk mendapatkan versi GNU dari beberapa utilitas inti.
drfrogsplat
1

Jumlah semua file dalam direktori:

OSX: find dir ! -type d -print0 | xargs -0 stat -f '%z' | awk '{sum += $1} END{print sum}'

Linux: find dir ! -type d -printf "%s\n" | awk '{sum += $1} END{print sum}'

Kristen
sumber
find: unrecognized: -printf. Gambar Alpine
gadelat