Come ottenere le dimensioni della cartella ignorando i collegamenti reali?


16

Uso rsnapshot per i backup, che genera una serie di cartelle contenenti file con lo stesso nome. Alcuni file sono strettamente collegati, mentre altri sono separati. Ad esempio, hourly.1/file1e hourly.2/file1potrebbe essere strettamente collegato allo stesso file, mentre hourly.1/file2e hourly.2/file2sono file completamente separati.

Voglio trovare la quantità di spazio utilizzata dalla cartella hourly.2 ignorando tutti i file che sono collegamenti fisici ai file hourly.1. Quindi, nell'esempio sopra, vorrei ottenere la dimensione di file2, ma ignoro file1.

Sto usando bash su Linux, e voglio farlo dalla riga di comando nel modo più semplice possibile, quindi nessuna grande soluzione grafica o solo per altri sistemi operativi, per favore.

Risposte:


7

Dimensione totale in byte di tutti i file in hourly.2cui è presente un solo collegamento:

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

Dalla findpagina man:

   -links n
          File has n links.

Per ottenere la somma in kilobyte anziché in byte, utilizzare -printf "%k\n"

Per elencare i file con conteggi di collegamenti diversi, giocare con find -links +1(più di un collegamento), find -links -5(meno di cinque collegamenti) e così via.


1
Se un file in cui si trova un collegamento reale a un file hourly2, il comando eseguirà una risposta errata.
cuonglm,

@Gnouc - Beh sì - dipende da come finiscono i file hourly.2. Se vengono copiati lì, non avranno collegamenti extra e il mio comando funzionerà. Se sono hard-link, ovviamente fallirà. Suppongo che vengano copiati nuovi file di backup.
Grebneke,

11

Se si desidera specificamente la dimensione dei file presenti sotto hourly.2ma non sotto hourly.1, è possibile ottenerla un po 'indirettamente con du. Se duelabora lo stesso file più di una volta (anche con nomi diversi, ad esempio collegamenti reali), conta il file solo la prima volta. Quindi ciò che du hourly.1 hourly.2segnala hourly.2è la dimensione che stai cercando. Così:

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

(Funziona su qualsiasi sistema POSIX e la maggior parte delle altre varianti Unix. Presuppone che il nome della directory hourly.1non contenga alcuna nuova riga.)


Per qualche strana ragione du non nota sempre i file hardlinked su RHEL5 - se faccio 'du -sh dir / sub dir' l'output per dir è lo stesso che se avessi appena detto 'du -sh dir' - non escludendo la dimensione di 'dir / sub'.
Andreas Krey,

8

Come dice @Gilles, poiché duconta solo il primo di tutti i collegamenti fissi che puntano allo stesso inode che incontra, puoi dargli delle directory di seguito:

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

Vale a dire qualsiasi file in 'hourly.2' che fa riferimento a un inode (aka file "reale") già indicato in 'hourly.1', non verrà conteggiato.


2
Secondo du --help , l'opzione --max-depth = 0 è equivalente a -s , quindi sopra può essere abbreviata come:$ du -hcs dirA dirB
akavel il

1

Le build di Awesomely BusyBox findarrivano senza -printfsupporto. Ecco una modifica alla risposta di @ grebneke :

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

1

Più semplice

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

Esempio

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

Grazie Abdel. Questa dovrebbe essere la risposta accettata.
Tiberio
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.