Sadece başka bir yerde sabit bağlantılı olmayan dosyalar tarafından kullanılan alan nasıl yapılır?


14

Yerden rsync --link-desttasarruf sağlayan anlık görüntüler için kullanarak , gerçekte ne kadar alan kazandığımı nasıl anlayabilirim? Veya daha genel:

Bir dizinin yalnızca dizin yapısının dışındaki başka bir yerde sabit bağlantılı olmayan dosyalar dikkate alınarak ne kadar alan kullandığını nasıl anlayabilirim? Farklı bir şekilde sordu: Bu dizinin silinmesinden sonra gerçekte ne kadar alan boşaltılacak? ( du -hsyalan söyler. Sert bağlantıların kendileri için gerekli alan dahil edilebilir)


2
Varsayılan duolarak, -l/ --count-linksseçeneğini kullanmadıkça GNU , sabit bağlı olsalar bile dosya boyutlarını yalnızca bir kez sayar . Bu duseç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.
jw013

Yanıtlar:


9

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.)


Teşekkürler, evet bu şart yerine getirilirse işe yarıyor. Ama ya değilse?
Tobias Kienzler

Bu, dizinlerin boyutunu (genellikle en az 2 bağlantıya sahip olan ve olmasaydı, iki kez sayılmış dosyalarınız) hesaba katmadığı için işe yaramaz.
Stéphane Chazelas

1
Daha sonra findinode'ları ve bağlantı sayısı ile tüm dosyaların bir listesini yazdırmak için kullanmak gerekli olacaktır ; sonra sort | uniq -cher bir inodeun ağaçta kaç kez göründüğünü elde etmek için bir kombinasyon , daha sonra bağlantı sayısından daha fazla görünüme sahip olanları filtreleyin ... ve sonra bu listeyi besleyin du. Ancak gereksinim yerine getirilirse, çabayı kurtarın.
angus

@StephaneChazelas Çalışıyor, ancak dizinlerin kendi boyutunu hesaba katmadığı doğru. Sadece 's benzeri dubir -dparametre olsaydı ls...
angus

Ayrıca btrfsdosya sistemlerinde, dizinlerin bağlantı sayısının her zaman olduğunu unutmayın 1, bu yüzden eklemeniz gerekir! -type d
Stéphane Chazelas

5

Temel olarak, tüm dosyalar (dizin olmayan) için inode numaralarını ve bağlantı sayısını almanız, bu bağlantı numarasını her inodeun oluşum sayısıyla karşılaştırmanız ve farklıysa dosyayı hariç tutmanız gerekir.

Hepsinin aynı dosya sisteminde olduğunu varsayarsak, bunun gibi bir şey çalışması gerekir (GNU find ile):

find . -type d -printf '%k\n' -o -printf '%i %n %k\n' |
   awk '
     NF==1{t+=$0; next}
     {n1[$1]=$2; n2[$1]++; s[$1]=$3}
     END {
       for (i in n1)
         if (n1[i] == n2[i])
           t+=s[i]
       print t
     }'

Evet, söylediklerim (kredi için teşekkürler). Ancak dizinleri sayarak elde ettiğiniz ekstra doğruluk, tam olmayan disk kullanımı ekleyerek kaybedersiniz.
angus

@angus, "hatalı disk kullanımı" ile ne demek istiyorsun?
Stéphane Chazelas

Hiçbir şey, %kbildirilenler hakkında tamamen yanılmışım . Bu harika, duhiç gerekli değil! Eve geldiğimde cevabımı güncelleyeceğim. Teşekkürler!
angus

3

du aslında yalan söylemez;) Birinin verdiği direkleri ayrıştırır, karşılaştığı aynı inode işaret eden tüm hardlinklerin ilkini sayar.

Yalnızca dubir dizinde gördüklerini sorarsanız , aynı içeriğe işaret eden başka sabit bağlantıların olması umursamaz:

$ du -h daily.0 && du -hc daily.1
29G /daily.0
29G /daily.1

Şimdi aynı satırda dirs verin (rsync artımlı yedeklemeler için en sonuncusundan başlayarak --link-dest):

$ du -hc daily.0 daily.1
29G /daily.0
364M /daily.1
29G total

Veya tüm yedekleme dizini:

$ du -hc --max-depth=1 /snapshots
29G /daily.0
364M /daily.1
537M /daily.2
333M /daily.3
30G total

'Daily.0' da zaten referansta bulunulan bir inode'a ("gerçek" dosya) atıfta bulunan herhangi bir dosya sayılmaz.

Bu nedenle günlük 1 silinmesi cihazınıza 364MB tasarruf sağlayacaktır.

KALDIRMAK

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.