2010-09-22 28 views
5

Tôi muốn so sánh tổng kích thước của hai thư mục dir1dir2 trên các hệ thống tệp khác nhau sao cho nếu diff -r dir1 dir2 trả về 0 thì tổng kích thước sẽ bằng nhau. Lệnh du trả về mức sử dụng đĩa và tùy chọn của nó --apparent-size không giải quyết được sự cố. Bây giờ tôi sử dụng một cái gì đó nhưLàm thế nào để so sánh kích thước của hai thư mục?

find dir1 ! -type d |xargs wc -c |tail -1 

để biết kích thước xấp xỉ của dir1. Có giải pháp nào tốt hơn không?

chỉnh sửa: ví dụ, tôi có (diff -r dir1 dir2 trả về 0: họ đều bình đẳng):

du -s dir1 --> 540 
du -s dir2 --> 166 

du -sb dir1 --> 250815 (the -b option is equivalent to --apparent-size -B1) 
du -sb dir2 --> 71495 

find dir1 ! -type d |xargs wc -c --> 62399 
find dir2 ! -type d |xargs wc -c --> 62399 
+1

Tại sao bạn không sử dụng 'du -s' để biết kích thước của một thư mục? – Wok

+2

Xác định chính xác ý bạn là "kích thước của hai thư mục". – joschi

+1

@wok: nó có thể báo cáo các kích thước khác nhau cho hai thư mục trên các tệp sytems khác nhau ngay cả khi các thư mục so sánh bằng 'diff'. – rafak

Trả lời

4

Nếu phiên bản của find-printf bạn có thể tìm thấy điều này xảy ra nhanh hơn khá nhiều.

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

Có ít nhất hai cách để tránh ký hiệu khoa học để xuất số lớn trong AWK.

END {OFMT = "%.0f"; print sum} 

END {printf "%.0f\n", sum} 

Các .0 truncates các chữ số thập phân vì chúng ta đang thực sự đối phó với một số nguyên và trố mắt của %d dường như không đúng cách hành động như %g trong phiên bản 3.1.5 (nhưng không phải 3.1.6 và sau).

Tuy nhiên, từ các tài liệu gawk:

Chú ý: Khi sử dụng các chữ cái dạng kiểm soát số nguyên cho các giá trị nằm ngoài phạm vi của các loại C nguyên rộng nhất, 'gawk' chuyển sang các ' % g 'specifier định dạng.

Hãy coi chừng vượt quá số nguyên tối đa cho hệ thống/phiên bản AWK của bạn.

+0

Tôi đã thử điều này và nhận được kết quả không chính xác: 2.11437e + 11. Awk có chức năng printf nên tôi đã thử: 'find dir1! loại d -printf "% s \ n" | awk '{sum + = $ 1} END {printf "% f \ n", tổng hợp}' 'và tôi nghĩ nó có kết quả chính xác: 211436502457.000000. Chỉnh sửa câu trả lời của bạn và tôi chắc chắn sẽ +1! –

+0

@JMcF: Bạn đang sử dụng phiên bản AWK nào? Tôi đã chỉnh sửa câu trả lời của mình để thêm một chút thông tin. –

+0

Đó là mawk 1.3.3 đi kèm với Ubuntu 12.04. Đó là phiên bản 64 bit nên những con số này phải nằm trong phạm vi rộng. Tuy nhiên, một câu trả lời rất kỹ lưỡng, cảm ơn. –

6

tôi không thể biết bạn muốn gì rõ ràng. Có lẽ bạn muốn điều này?
diff <(du -sh dir1) <(du -sh dir2)

+1

Có thể không, nhưng đó là chính xác những gì tôi đang tìm kiếm. –

Các vấn đề liên quan