Dengan asumsi tidak ada hardlink internal (yaitu, setiap file dengan lebih dari 1 hardlink ditautkan dari luar pohon), Anda dapat melakukannya:
find . -links -2 -print0 | du -c --files0-from=-
EDIT Dan inilah yang saya sketsa di komentar, diterapkan. Hanya tanpa du; kudos to @StephaneChazelas untuk memperhatikan dutidak perlu. Penjelasan di akhir.
( 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
Apa yang kami lakukan adalah membuat string dengan penggunaan disk (dalam KB) dari setiap file yang relevan, dipisahkan dengan tanda plus. Lalu kami memberi makan tambahan besar itu bc.
findDoa pertama melakukannya untuk direktori.
findCetakan kedua menghitung jumlah penghitungan, inode, dan penggunaan disk. Kami melewati daftar itu sort | uniq -cuntuk mendapatkan daftar (jumlah tampilan di pohon, jumlah tautan, inode, penggunaan disk).
Kami melewati bahwa daftar melalui awk, dan, jika field pertama (# dari penampilan) lebih besar dari atau sama kedua (# dari hardlinks), yang berarti tidak ada link ke file ini dari luar pohon, kemudian mencetak lapangan keempat ( penggunaan disk) dengan tanda plus dan garis miring terbalik.
Akhirnya kita menghasilkan a 0, jadi rumusnya secara sintaksis benar (itu akan menjadi +sebaliknya) dan meneruskannya ke bc. Fiuh.
(Tapi saya akan menggunakan metode pertama yang lebih sederhana, jika itu memberikan jawaban yang cukup baik.)
duhanya menghitung ukuran file satu kali bahkan jika mereka terhubung keras kecuali Anda menggunakan opsi-l/--count-links. Anda menjalankanduseluruh pohon dua kali, dengan dan tanpa opsi itu dan perbedaan antara ukuran harus berapa banyak ruang yang Anda simpan di semua direktori.