Mengapa du -b menunjukkan hasil yang berbeda dari stat?

5

Saya baru-baru ini mengalami masalah ini:

find /tmp/tmp33hn25wv -type f -exec stat --format='%s' {} + | awk '{s+=$1} END {print s}'
10420224

du -bs /tmp/tmp33hn25wv
12198004    /tmp/tmp33hn25wv

Hasil berbeda secara konsisten. Semua file ditulis dalam beberapa byte ukuran blok.

Di mana du menemukan byte tambahan ini? Saya mengerti bahwa sistem file mungkin memerlukan lebih atau kurang ruang untuk menyimpan konten file, tetapi saya berharap -bopsi itu duberarti harus menghitung ukuran "nyata", bukan ukuran yang digunakan oleh sistem file ...

wvxvw
sumber

Jawaban:

3

dutermasuk ukuran direktori. Jika Anda menambahkan -type dke findkriteria Anda mungkin mendapatkan hasil yang Anda inginkan (saya lakukan pada pohon direktori yang hanya berisi file standar):

find /tmp/tmp33hn25wv \( -type f -o -type d \) -exec stat --format='%s' {} + |\
    awk '{s+=$1} END {print s}'

Namun, mungkin ada jenis file lain yang menghabiskan banyak ruang, jadi coba hapus semua jenis pemeriksaan ini:

find /tmp/tmp33hn25wv -exec stat --format='%s' {} + | awk '{s+=$1} END {print s}'
AFH
sumber
Ini menarik. Saya harus memeriksanya ketika saya kembali bekerja. Namun, apa ukuran direktori yang "jelas"? Saya mengerti bahwa, dalam hal sistem file, direktori memang membutuhkan ruang, tetapi apa yang diperhitungkan terhadap ruang itu, ketika dudiperhitungkan? Apakah ini struktur inode? Apakah seluruh daftar entri?
wvxvw
Direktori tampaknya dialokasikan dalam kelipatan 4096 byte (setidaknya pada disk saya dengan ukuran blok 4KiB). Tanpa memeriksa, saya berasumsi bahwa direktori diisi dengan entri kosong untuk mengisi blok yang dialokasikan.
AFH
Apa yang terjadi dengan findperintah alternatif saya ?
AFH
OK, sepertinya memang berasal dari direktori. Ketika saya menjalankan perintah yang sama, tetapi untuk direktori daripada file, saya mendapatkan angka yang sama duakan menghasilkan. Jadi, sekarang pertanyaannya bermuara pada apa yang dudiukur ketika mengukur direktori.
wvxvw
Setiap kali ls -ldaftar direktori, itu menunjukkan kelipatan dari ukuran blok: seperti yang saya katakan sebelumnya, saya menganggap ukuran yang dialokasikan diisi dengan entri kosong, sehingga ukuran yang dialokasikan dan jelas selalu sama. Perhatikan bahwa jenis file lainnya, seperti FIFO dan tautan simbolik, dapat menempati ruang disk, yang berarti bahwa perbedaannya tidak perlu kelipatan dari jumlah direktori.
AFH