Sabit bağlantıları yoksayarak klasör boyutu nasıl alınır?


17

Aynı adda dosyalar içeren bir dizi klasör üreten yedeklemeler için rsnapshot kullanıyorum. Bazı dosyalar sabit bağlıyken bazıları ayrı. Örneğin hourly.1/file1ve hourly.2/file1aynı dosyaya sabit olarak bağlanmış olabilir hourly.1/file2ve hourly.2/file2tamamen ayrı dosyalardır.

Dosyalara sabit bağlantılar olan dosyaları yok hourly.2 sayarak klasör tarafından kullanılan alan miktarını bulmak istiyorum hourly.1. Yukarıdaki örnekte, ben file2 boyutunu almak istiyorum, ama file1 göz ardı etmek istiyorum.

Linux'ta bash kullanıyorum ve bunu komut satırından olabildiğince basit yapmak istiyorum, bu yüzden büyük grafik veya yalnızca işletim sistemi olmayan çözümler lütfen.

Yanıtlar:


7

hourly.2Yalnızca bir bağlantısı olan tüm dosyaların bayt cinsinden toplam boyutu :

$ find ./hourly.2 -type f -links 1 -printf "%s\n" | awk '{s=s+$1} END {print s}'

Gönderen findinsan-sayfa:

   -links n
          File has n links.

Toplamı bayt yerine kilobayt olarak almak için -printf "%k\n"

Farklı bağlantı sayılarına sahip dosyaları listelemek için find -links +1(birden fazla bağlantı), find -links -5(beş bağlantıdan az) vb. İle oynatın .


1
Bir dosya içindeki bir dosyaya sabit bağlantı olan bir dosya varsa hourly2, komutunuz yanlış yanıtı prosedürleyecektir.
cuonglm

@Gnouc - Evet - dosyaların nasıl sonuçlandığına bağlı hourly.2. Orada kopyalanırlarsa, fazladan bağlantıları olmayacak ve komutum çalışacak. Sabit bağlantılılarsa, kesinlikle başarısız olacaktır. Yeni yedekleme dosyalarının kopyalandığını varsayıyorum.
grebneke

11

Özellikle altında bulunan hourly.2ancak altında olmayan dosyaların boyutunu istiyorsanız, hourly.1bunu dolaylı olarak biraz alabilirsiniz du. Eğer duaynı dosya birden çok kez süreçler (hatta farklı isimler altında, sabit bağlantıları yani), sadece dosyayı ilk sayar. Yani du hourly.1 hourly.2raporlar hourly.2aradığınız boyut. Böylece:

du -ks hourly.1 hourly.2 | sed -n '2s/[^0-9]*//p'

(Herhangi bir POSIX sisteminde ve diğer birçok Unix varyantında çalışır. Dizin adının hourly.1yeni satır içermediğini varsayar .)


Bazı garip nedenlerden dolayı du RHEL5'teki sabit bağlantılı dosyaları her zaman fark etmez - eğer 'du -sh dir / sub dir' yaparsam dir için çıkış sadece 'du -sh dir' dedim gibi aynıdır - boyut hariç 'dir / sub'.
Andreas Krey

9

@Gilles'ın dediği gibi, dukarşılaştığı aynı inode işaret eden tüm sabit bağlantıların yalnızca ilkini saydığından, arka arkaya dizinler verebilirsiniz:

$ du -hc --max-depth=0 dirA dirB
29G /hourly.1
 1G /hourly.2
30G total

Yani 'hourly.1' içinde zaten referansta bulunulan bir inode'a ("gerçek" dosya) atıfta bulunan 'hourly.2' içindeki herhangi bir dosya sayılmaz.


2
Göre du --help seçeneği --max derinlemesine = 0 eşdeğerdir -s , bu nedenle yukarıdaki gibi kısaltılabilir:$ du -hcs dirA dirB
akavel

2

Daha basit

du -hc --max-depth=1 path/

Misal

9.4G    daily/users/rockspa/home/daily.21
3.6G    daily/users/rockspa/home/daily.30
4.2G    daily/users/rockspa/home/daily.11
1.1G    daily/users/rockspa/home/daily.4
4.2G    daily/users/rockspa/home/daily.9
3.0G    daily/users/rockspa/home/daily.25
3.5G    daily/users/rockspa/home/daily.20
4.2G    daily/users/rockspa/home/daily.13
913M    daily/users/rockspa/home/daily.5
2.8G    daily/users/rockspa/home/daily.26
1.4G    daily/users/rockspa/home/daily.1
2.6G    daily/users/rockspa/home/daily.28
4.2G    daily/users/rockspa/home/daily.15
3.8G    daily/users/rockspa/home/daily.19
327M    daily/users/rockspa/home/daily.8
4.2G    daily/users/rockspa/home/daily.17
3.1G    daily/users/rockspa/home/daily.23
...

Teşekkürler Abdel. Bu kabul edilen cevap olmalı.
TiberiusKirk

Muhteşem. Bu benim için macOS 10.15 ilk denemede çalıştı. Teşekkür ederim.
dimitarvp

1

Awesomely BusyBox'ın yapıları finddesteksiz gelir -printf. İşte @ grebneke'nin cevabında değişiklik :

find . -type f -links 1 -exec ls -l {} \;| awk '{s=s+$5} END {print s}'
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.