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 du
là 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 find
yêu cầu đầu tiên làm điều đó cho các thư mục.
Việc find
in 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 awk
và, 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 0
cô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.)
du
chỉ đế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ạydu
trê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.