Giả sử không có liên kết cứng nội bộ (nghĩa là mọi tệp có nhiều hơn 1 liên kết cứng được liên kết từ bên ngoài cây), bạn có thể làm:
find . -links -2 -print0 | du -c --files0-from=-
EDIT Và đây là những gì tôi phác thảo trong bình luận, áp dụng. Chỉ không có du; kudos đến @StephaneChazelas để nhận thấy dulà không cần thiết. Giải thích ở cuối.
( find . -type d -printf '%k + ' ; \
find . \! -type d -printf '%n\t%i\t%k\n' | \
sort | uniq -c | \
awk '$1 >= $2 { print $4 " +\\" }' ; \
echo 0 ) | bc
Những gì chúng tôi làm là tạo một chuỗi với việc sử dụng đĩa (tính bằng KB) của mỗi tệp có liên quan, được phân tách bằng dấu cộng. Sau đó, chúng tôi cho ăn bổ sung lớn đó bc.
Các findyêu cầu đầu tiên làm điều đó cho các thư mục.
Việc findin thứ hai liên kết đếm, inode và sử dụng đĩa. Chúng tôi chuyển danh sách đó qua sort | uniq -cđể có được danh sách (số lần xuất hiện trong cây, số lượng liên kết, inode, mức sử dụng đĩa).
Chúng tôi chuyển danh sách đó qua awkvà, nếu trường đầu tiên (# xuất hiện) lớn hơn hoặc bằng thứ hai (# của liên kết cứng), có nghĩa là không có liên kết đến tệp này từ bên ngoài cây, sau đó in trường thứ tư ( sử dụng đĩa) với dấu cộng và dấu gạch chéo ngược kèm theo.
Cuối cùng, chúng tôi xuất ra một 0công thức, vì vậy công thức là đúng về mặt cú pháp (nó sẽ +khác) và chuyển nó sang bc. Phù.
(Nhưng tôi sẽ sử dụng phương pháp đầu tiên đơn giản hơn, nếu nó cho câu trả lời đủ tốt.)
duchỉ đếm kích thước tệp một lần ngay cả khi chúng được liên kết cứng trừ khi bạn sử dụng tùy chọn-l/--count-links. Bạn chạydutrên toàn bộ cây hai lần, có và không có tùy chọn đó và sự khác biệt giữa các kích thước sẽ là dung lượng bạn đã lưu trên tất cả các thư mục.