Qual'è la differenza tra du -h e ls -lh?


31

Sto avendo difficoltà a capire qual è il modo corretto di leggere la dimensione dei file poiché ogni comando ti dà risultati diversi. Mi sono anche imbattuto in un post su http://forums.devshed.com/linux-help-33/du-and-ls-generating-inconsistent-file-sizes-42169.html in cui si afferma quanto segue;

du ti dà la dimensione del file che risiede sul file system. (IE ti darà sempre un risultato divisibile per 1024).

Ti darà la dimensione effettiva del file.

Quello che stai osservando è la differenza tra la dimensione effettiva del file e la quantità di spazio sul disco che occupa. (chiamato anche efficienza del file system).

Qual è la differenza tra come risiede sul file system e la dimensione effettiva del file

Risposte:


48

Questo si chiama spazio lento :

Ogni strato di astrazione sopra singoli bit e byte comporta uno spazio sprecato quando un file di dati è più piccolo dell'unità di dati più piccola che il file system è in grado di tracciare. Questo spazio sprecato all'interno di un settore, cluster o blocco è comunemente indicato come spazio lento e non può normalmente essere utilizzato per l'archiviazione di dati aggiuntivi. Per singoli settori a 256 byte, lo spazio sprecato massimo è 255 byte. Per i cluster da 64 kilobyte, lo spazio massimo sprecato è 65.535 byte.

Quindi, se il tuo filesystem alloca spazio in unità di 64 KB e memorizzi un file di 3 KB, allora:

  • la dimensione effettiva del file è di 3 KB.
  • la dimensione residente del file è 64 KB, poiché i rimanenti 61 KB in quell'unità non possono essere allocati su un altro file e vanno persi.

Nota : alcuni filesystem supportano la sottoallocazione a blocchi , che aiuta a mitigare questo problema assegnando più file piccoli (o le estremità di file di grandi dimensioni) nello stesso blocco.


1
Questa è una dannata buona spiegazione.
SpacemanSpiff

1
@ Handyman5 - Grazie Handyman5. Quindi, quando guardo la dimensione di un file o di una cartella usando ls restituisce la dimensione reale mentre du restituisce la dimensione del residente? È corretto? Quindi, quando si guarda alla dimensione del file, qual è la dimensione del residente più precisa, ovvero la dimensione del file o è una domanda arbitraria?
PeanutsMonkey,

8
@PeanutsMonkey, la precisione è negli occhi di chi guarda. ;-) Fondamentalmente, se sei preoccupato di quanto spazio il file occuperebbe altrove (come la copia in rete, l'aggiunta a un file zip, il backup su un'unità esterna, ecc.), Allora la dimensione effettiva è ciò che ti preoccupi di. Se sei preoccupato per la quantità di spazio rimasto sull'unità in cui risiede il file ora, ti preoccupi delle dimensioni del residente. Dal momento duche ti sta mostrando il saggio di disk u, sta guardando lo spazio occupato sull'unità corrente e quindi ti mostra le dimensioni del residente.
Tuttofare, 5

1
@ Handyman5 - È quasi un anno dopo il post ma sono curioso di sapere come la risposta sopra differisce quando si utilizza df -h?
PeanutsMonkey,

1
dfriporta il numero di blocchi rimanenti * la dimensione del blocco del filesystem. In questo caso sarebbe più simile du, poiché anche i blocchi parzialmente utilizzati sono considerati completamente allocati. dffondamentalmente traduce statvfs , quindi puoi guardare quella chiamata di sistema per avere un'idea migliore di ciò che sta succedendo.
Tuttofare, 5

19

C'è un'altra opzione qui, che non è stata coperta: i file sparsi . In questo caso, dumostrerà una dimensione più piccola di un semplice ls -lsarebbe, perché lssta riportando la "dimensione" del file come la apparente dimensione (il numero di byte che si poteva leggere, se si voleva un sacco di zeri), mentre duvolontà continuare a utilizzare il numero effettivo di blocchi del disco in uso.

Trucco divertente: crea molti file sparsi di grandi dimensioni, quindi stupisci i tuoi amici con quanto spazio su disco hai ("guarda, sto archiviando file da 1 TB da undici gazillion!"). OK, forse non è poi così divertente.


6

I filesystem sono costituiti da blocchi. I file non devono adattarsi perfettamente ai blocchi. Se un file fosse 1024 byte, la sua dimensione in ls e du sarebbe 1024. Se la dimensione del file fosse 1025, la dimensione sarebbe 1025 in ls e 2048 in du.

Nota che l'esempio sopra presuppone una dimensione di blocco di 1024. Le dimensioni di blocco più grandi sono la norma in questi giorni e, g,

ls -l fred
-rw-r--r-- 1 iain users 1024 Jul 13 22:06 fred

du -h fred
8.0K    fred

0

C'è ancora un altro motivo per cui potrebbero essere diversi. du -h sa quando vede lo stesso file con un altro nome (hard link, al contrario dei link simbolici) e riporterà ogni file per la dimensione in cui si trova, ma aggiunge la dimensione solo una volta alla directory principale comune.

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.