Differenza di calcolo delle dimensioni della directory


9

Ho bisogno di ottenere la dimensione della directory nel terminale per scopi di firma. Sto usando il seguente comando:

du -s /path/to/dir

Sto moltiplicando il risultato per la dimensione del blocco UNIX tradizionale (512 byte) e ottengo la dimensione effettiva della directory in byte. Tuttavia, la finestra di dialogo "Ottieni informazioni" del Finder mostra una dimensione leggermente inferiore a quella calcolata con il comando terminale. E sembra che sia riproducibile su qualsiasi cartella / bundle. Cosa mi sto perdendo?

Risposte:


11

Normalmente, dumostra informazioni sull'utilizzo del disco (da cui deriva il suo nome). Tieni presente che

disk usage != sum of file sizes

Perché ogni file occupa un numero di blocchi sul filesystem (vedi man mkfs.ext2ad esempio). Ciò significa che solo in una situazione molto rara l'utilizzo del disco di un file equivale alla sua dimensione effettiva - per questo, la dimensione deve essere esattamente un multiplo della dimensione del blocco.

Pensa ai blocchi di filesystem come a scatole che contengono parti di file: ognuna può contenere una parte di un solo file.

Per la versione GNU di du, controlla l' --apparent-sizeopzione.


Una situazione ancora più interessante può verificarsi quando ci sono alcuni file sparsi sul file system!


Non esiste tale opzione (sono su OS X, non su Linux). Probabilmente avevo bisogno di menzionarlo in una domanda, poiché il tag non è abbastanza.)
Eimantas,

Ah, giusto ... Allora dai un'occhiata alla manpage e prova a trovare riferimenti a actualo apparent. (Vedi anche la mia spiegazione aggiornata).
rozcietrzewiacz,

2
Corretto tranne per la disuguaglianza. Le dimensioni dei file possono talvolta essere maggiori dello spazio su disco effettivo necessario per memorizzarle. ( unix.stackexchange.com/q/33801/9426 )
Stéphane Gimenez

@ StéphaneGimenez Wow ... grazie per avermelo detto!
rozcietrzewiacz,

2

Informazioni su Mac OS X e Finder (in Snow Leopard, versione 10.6.8) ho notato quanto segue.

  • Ottengo i conteggi dei byte per le figure "quantificate" del Finder di un percorso (file o cartella) con il codice (in bash(1)) di seguito.
  • Le finestre e il riquadro "Info" del Finder mostrano le cifre "quantificate" (ad esempio chilogrammi in KB) in byte decimali (base 10, 1000) rispetto ai byte binari (base 2, 1024), quindi "quantifico" dividendo per 1000 e aumentando il "quantificatore" (magnitudo) del prefisso dell'unità (byte) ed eseguendo alcuni arrotondamenti "off key". (Il mio codice completo è pieno di codice di sviluppo commentato e diviso in diversi file (e lingue), quindi è difficile da condividere.)
    Finora ho visto le mie figure "quantificate" sono le stesse figure "quantificate" nel Finder .
  • Inoltre, insieme al codice, voglio dire che non ho (e non ho mai avuto) alcuna variabile d'ambiente BLOCKSIZEimpostata nella mia shell, ma ho testato (ora, un po ') entrambe le versioni e i valori predefiniti per $BLOCKSIZEdanno gli stessi valori.

#!/usr/bin/env bash
#tab-width:4
                                 du -s                      "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-0512}'   }'||exit $?         #macosx  (xnu)
#                               gdu -sB${BLOCKSIZE:-4096}   "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-4096}'   }'||exit $?         #macports gnu

  • Il numero non quantificato non sono riuscito a trovare.
    L'unica cosa che posso dire è che mi avvicino solo contando i file (escludendo così la directory ~ 'meta file system / header' ~ dati) e che il più vicino che ottengo è il seguente.

#!/usr/bin/env bash
#tab-width:4
    for a;do find "$a" -type f -print0|xargs -0      stat -f %z         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macosx  (xnu)
#   for a;do find "$a" -type f -print0|xargs -0     gstat -c %s         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macports gnu
  • Né (xnu) du(1) né (gnu) gdu(1) sembrano contare gli attributi estesi ( xattr)

E poi devo solo gioco di parole 'Esegui il percorso e fare la matematica'
Peace out e buonanotte fo'real questa volta.


1

Sul mio sistema Ubuntu, usando ext4, du -b fileindica la dimensione in byte di un file reale e du -b dirindica la dimensione in byte del file (i) + directory overhead, L'overhead è, nel mio caso, multipli di 4096 byte ..

Questo sovraccarico aumenta all'aumentare del numero di file.
Nota: anche se i file vengono eliminati, l'overhead della directory rimane al livello più alto che era prima dell'eliminazione dei file.

Non ho provato a riavviare, per vedere se ripristina, ma in entrambi i casi, ciò significa che la dimensione della directory varia a seconda delle circostanze storiche.

Il conteggio delle dimensioni di ciascun file può essere l'opzione migliore per un valore accurato delle dimensioni totali del file .

Il seguente script totalizza tutte le dimensioni dei file (in byte).

Per OS X, se non si dispone -bdell'opton per 'du', è possibile utilizzare statinvece (se lo si possiede :) ... La riga commentata mostra l' statalternativa a Ubuntu du -b;

unset total
while IFS= read -r -d $'\0' rf; do
  # (( total += $(stat  "$rf" | sed -nre 's/^  Size: ([0-9]+).*/\1/p') ))
    (( total += $(du -b "$rf" | cut -f 1) ))
done < <(find  . -type f  -name '*' -print0)
echo $total

2
OSX non hadu -b e un diversostat . Il tuo script non è portatile al di fuori di Linux in entrambi i casi.
Gilles 'SO- smetti di essere malvagio'

Con MacPorts su OS X puoi installare coreutilsper ottenere la versione GNU di duas gdu. Quindi non è esattamente portatile, ma può essere utile per le persone su OS X per ottenere le versioni GNU di alcuni programmi di utilità di base.
drfrogsplat,

1

Somma tutti i file in una directory:

OSX: find dir ! -type d -print0 | xargs -0 stat -f '%z' | awk '{sum += $1} END{print sum}'

Linux: find dir ! -type d -printf "%s\n" | awk '{sum += $1} END{print sum}'


find: unrecognized: -printf. Immagine alpina
gadelat
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.