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 du
tidak 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
.
find
Doa pertama melakukannya untuk direktori.
find
Cetakan kedua menghitung jumlah penghitungan, inode, dan penggunaan disk. Kami melewati daftar itu sort | uniq -c
untuk 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.)
du
hanya menghitung ukuran file satu kali bahkan jika mereka terhubung keras kecuali Anda menggunakan opsi-l
/--count-links
. Anda menjalankandu
seluruh pohon dua kali, dengan dan tanpa opsi itu dan perbedaan antara ukuran harus berapa banyak ruang yang Anda simpan di semua direktori.