Dahili sabit bağlantıların olmadığı varsayılırsa (yani, 1'den fazla sabit bağlantıya sahip her dosya ağacın dışından bağlanır), şunları yapabilirsiniz:
find . -links -2 -print0 | du -c --files0-from=-
EDIT Ve ben burada yorumda çizdiğim, uygulandı. Sadece olmadan du; @StephaneChazelas'a dikkat etmek için kudos dugerekli değildir. Sonunda açıklama.
( 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
Yaptığımız şey, her ilgili dosyanın disk kullanımı (KB cinsinden) ile artı işaretleriyle ayrılmış bir dize oluşturmaktır. Sonra o büyük ilaveyi besliyoruz bc.
İlk findçağırma bunu dizinler için yapar.
İkinci findbaskı bağlantı sayısı, inode ve disk kullanımını yazdırır. sort | uniq -cBir liste almak için bu listeden geçiyoruz (ağaçtaki görünüm sayısı, bağlantı sayısı, inode, disk kullanımı).
Biz geçen o aracılığıyla listeyi awkağacının dışından bu dosyaya bağlantılar bulunmamaktadır anlam ve, ilk alan (görünüşler #) büyükse ya da (sabit bağlantılarını içinde) ikinci eşit, daha sonra (dördüncü alan yazdırmak disk kullanımı) artı işareti ve ters eğik çizgi eklenmiş olarak.
Son olarak a çıktısı veririz 0, böylece formül sözdizimsel olarak doğrudur ( +aksi takdirde enine olur ) ve bunu geçirir bc. Uf.
(Ama yeterince iyi bir cevap verirse daha basit ilk yöntemi kullanırdım.)
duolarak,-l/--count-linksseçeneğini kullanmadıkça GNU , sabit bağlı olsalar bile dosya boyutlarını yalnızca bir kez sayar . Buduseçenekle birlikte ve bu seçenek olmadan tüm ağacın üzerinde iki kez koşuyorsunuz ve boyutlar arasındaki fark, tüm dizinler üzerinde ne kadar alan kaydettiğiniz olmalıdır.