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 du
gerekli 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 find
baskı bağlantı sayısı, inode ve disk kullanımını yazdırır. sort | uniq -c
Bir 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 awk
ağ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.)
du
olarak,-l
/--count-links
seçeneğini kullanmadıkça GNU , sabit bağlı olsalar bile dosya boyutlarını yalnızca bir kez sayar . Budu
seç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.