Sự khác biệt tính toán kích thước thư mục


9

Tôi cần phải có được kích thước của thư mục trong thiết bị đầu cuối cho mục đích ký kết. Tôi đang sử dụng lệnh sau:

du -s /path/to/dir

Tôi nhân kết quả với kích thước khối UNIX truyền thống (512 byte) và nhận kích thước thư mục thực tế theo byte. Tuy nhiên, cửa sổ hộp thoại "Nhận thông tin" của Trình tìm kiếm hiển thị kích thước nhỏ hơn một chút so với cửa sổ được tính bằng lệnh đầu cuối. Và dường như nó có thể tái tạo trên bất kỳ thư mục / gói nào. Tôi đang thiếu gì?

Câu trả lời:


11

Thông thường, duhiển thị thông tin về việc sử dụng đĩa (đó là tên của nó đến từ đâu). Hãy ghi nhớ rằng

disk usage != sum of file sizes

Bởi vì mỗi tệp chiếm một số khối trên hệ thống tệp (xem man mkfs.ext2ví dụ). Điều này có nghĩa là chỉ trong một tình huống rất hiếm, việc sử dụng đĩa của một tệp bằng với kích thước thực của nó - vì điều đó, kích thước phải chính xác là bội số của kích thước khối.

Hãy nghĩ về các khối hệ thống tệp như các hộp chứa các phần của tệp - mỗi hộp có thể chứa một phần chỉ một tệp.

Đối với phiên bản GNU của du, hãy kiểm tra --apparent-sizetùy chọn.


Một tình huống thậm chí thú vị hơn có thể xảy ra, khi có một số tệp thưa thớt trên hệ thống tệp!


Không có tùy chọn như vậy (Tôi đang dùng OS X, không phải Linux). Có lẽ cần phải đề cập rằng trong một câu hỏi, vì thẻ là không đủ.)
Eimantas

À, phải rồi ... Sau đó hãy xem trang chủ và cố gắng tìm tài liệu tham khảo actualhoặc apparent. (Cũng xem giải thích cập nhật của tôi).
rozcietrzewiacz

2
Đúng ngoại trừ bất đẳng thức. Kích thước tệp đôi khi có thể lớn hơn dung lượng đĩa thực cần thiết để lưu trữ chúng. ( unix.stackexchange.com/q/33801/9426 )
Stéphane Gimenez

@ StéphaneGimenez Wow ... cảm ơn vì đã nói với tôi!
rozcietrzewiacz

2

Giới thiệu về Mac OS X và Finder (trong Snow Leopard, phiên bản 10.6.8) tôi đã nhận thấy những điều sau đây.

  • Tôi nhận được số byte cho các số liệu 'định lượng' của Trình tìm đường dẫn (tệp hoặc thư mục) với mã (trong bash(1)) bên dưới.
  • Cửa sổ và cửa sổ "Thông tin" của Trình tìm kiếm hiển thị các số liệu 'được định lượng' (ví dụ kilo tính bằng KB) theo byte thập phân (cơ sở 10, 1000) trái ngược với byte nhị phân (cơ sở 2, 1024) để sau đó tôi 'định lượng' bằng cách chia cho 1000 và tăng tiền tố đơn vị (byte) 'bộ định lượng' (độ lớn) và thực hiện một số làm tròn "khóa tắt" lẻ. (Mã đầy đủ của tôi chứa đầy mã phát triển được nhận xét và được chia thành nhiều tệp (và ngôn ngữ) nên rất khó để chia sẻ.)
    Cho đến nay tôi đã thấy các số liệu 'định lượng' của mình giống như các số liệu 'được định lượng' trong Trình tìm kiếm .
  • Ngoài ra, cùng với mã tôi muốn nói rằng tôi không có biến môi trường (và chưa bao giờ có) môi trường nào BLOCKSIZEđược đặt trong trình bao của mình nhưng tôi đã thử nghiệm (bây giờ, một chút) cả hai phiên bản và các giá trị mặc định cho $BLOCKSIZEcùng một giá trị.

#!/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

  • Số lượng không đủ điều kiện tôi đã không quản lý để phù hợp.
    Điều duy nhất tôi có thể nói là tôi tiến gần hơn bằng cách chỉ đếm các tệp (do đó loại trừ thư mục ~ 'chỉ mục / tiêu đề meta hệ thống tệp ~ ~) và dữ liệu gần nhất tôi nhận được là như sau.

#!/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
  • Cả (xnu) du(1) cũng không (gnu) gdu(1) dường như không tính các thuộc tính mở rộng ( xattr)

Và sau đó tôi phải chơi chữ 'Chạy theo con đường và làm toán'
Hòa bình và chúc ngủ ngon lần này.


1

Trên hệ thống Ubuntu của tôi, sử dụng ext4, du -b filecung cấp kích thước tính theo byte của một tệp thực tế và du -b dircung cấp kích thước tính theo byte của tệp (s) + thư mục trên đầu, trong trường hợp của tôi, là bội số của 4096 byte ..

Chi phí này tăng khi số lượng tập tin tăng lên.
Lưu ý: ngay cả khi các tệp bị xóa, chi phí thư mục vẫn ở mức cao hơn trước khi các flles bị xóa ..

Tôi chưa thử khởi động lại, để xem nó có hoàn nguyên không, nhưng trong cả hai trường hợp, điều này có nghĩa là kích thước thư mục thay đổi tùy theo hoàn cảnh lịch sử.

Kiểm đếm từng kích thước tệp có thể là tùy chọn tốt nhất cho giá trị chính xác của tổng kích thước tệp .

Tập lệnh sau tổng cộng tất cả các kích thước tệp (tính bằng byte) ..

Đối với OS X, nếu bạn không có -bopton cho 'du', bạn có thể sử dụng statthay thế. (Nếu bạn có nó :) ... Dòng nhận xét hiển thị statthay thế Ubuntu cho 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

2
OSX không códu -bkhácstat . Kịch bản của bạn không thể mang theo bên ngoài Linux.
Gilles 'SO- ngừng trở nên xấu xa'

Với MacPorts trên OS X, bạn có thể cài đặt coreutilsđể có phiên bản GNU dugdu. Vì vậy, nó không chính xác di động, nhưng có thể hữu ích cho những người dùng OS X để có được các phiên bản GNU của một vài tiện ích cốt lõi.
drfrogsplat

1

Tính tổng tất cả các tệp trong một thư mục:

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}'


find: unrecognized: -printf. Hình ảnh núi cao
gadelat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.