Come ottenere la dimensione fisica di un file in Linux?


12

Posso usare ls -lper ottenere la dimensione logica di un file, ma c'è un modo per ottenere la dimensione fisica di un file?


Per favore, definisci cosa intendi per dimensione "fisica".
Jörg W Mittag,

Risposte:


28

ls -lti darà la dimensione apparente del file, che è il numero di byte che un programma leggerebbe se leggesse il file dall'inizio alla fine. duti darebbe la dimensione del file "su disco".

Per impostazione predefinita, duti dà la dimensione del file in numero di blocchi del disco, ma puoi usare invece -hper ottenere un'unità leggibile dall'uomo. Vedi anche il manuale per dusul tuo sistema.

Nota che con GNU coreutil du(che è probabilmente quello che hai su Linux), -bottenere byte implica l' --apparent-sizeopzione. Questo non è ciò che si desidera utilizzare per ottenere il numero di byte effettivamente utilizzati sul disco. Utilizzare invece --block-size=1o -B 1.

Con GNU ls, puoi anche fare ls -s --block-size=1il file. Questo darà lo stesso numero du -B 1del file.


Esempio:

$ ls -l file
-rw-r--r--  1 myself wheel  536870912 Apr  8 11:44 file

$ ls -lh file
-rw-r--r--  1 myself wheel   512M Apr  8 11:44 file

$ du -h file
24K    file

$ du -B 1 file
24576   file

$ ls -s --block-size=1 file
24576 file

Ciò significa che si tratta di un file da 512 MB che richiede circa 24 KB su disco. È un file sparso (per lo più zeri che non sono effettivamente scritti su disco ma rappresentati come "buchi" logici nel file). I file sparsi sono comuni quando si lavora con file di grandi dimensioni pre-allocati, ad esempio immagini del disco per macchine virtuali o file di scambio, ecc. La creazione di un file sparse è rapida, mentre il riempimento con zeri è lento (e non necessario).

Vedi anche il manuale per fallocatesul tuo sistema Linux.


nel qual caso questa differenza è importante? puoi fare un esempio pratico? Grazie in anticipo.
D'Arcy Nader

1
@ D'ArcyNader Vedi la risposta aggiornata.
Kusalananda

Correggimi se fraintendo qualcosa, ma sembra che la prima frase sia al contrario: stackoverflow.com/a/31437673/3701431 du mostrerebbe quanti dati possono essere effettivamente letti, mentre lsmostra in che misura vengono allocati i settori del disco.
Sergiy Kolodyazhnyy,

2
@SergiyKolodyazhnyy (mi dispiace rispondere in ritardo) No, dumostra la quantità di disco effettivamente utilizzata dal file, mentre la dimensione apparente (dimensione logica) indicata da lsè quanti byte un programma sarebbe in grado di leggere da esso. Se il file è scarso, alcuni dei byte letti sarebbero zero, ma sarebbero comunque consegnati al programma che li leggeva (ma non dal disco).
Kusalananda

Questa è stata davvero una buona risposta.
Lizardx,

3

Ottengo la dimensione del file in byte come questo:

actualsize=$(du -b "${file}" | cut -f 1)
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.