Jak uzyskać fizyczny rozmiar pliku w systemie Linux?

12

Mogę użyć, ls -laby uzyskać logiczny rozmiar pliku, ale czy istnieje sposób, aby uzyskać fizyczny rozmiar pliku?

użytkownik285003
źródło
Proszę zdefiniować, co rozumiesz przez „fizyczny” rozmiar.
Jörg W Mittag,

Odpowiedzi:

28

ls -lpoda pozorny rozmiar pliku, czyli liczbę bajtów, które program odczytałby, gdyby odczytał plik od początku do końca. dudałby ci rozmiar pliku „na dysku”.

Domyślnie dupodaje rozmiar pliku w liczbie bloków dysku, ale -hzamiast tego można użyć jednostki czytelnej dla człowieka. Zobacz także instrukcję dudotyczącą twojego systemu.

Zauważ, że w GNU coreutil du(który jest prawdopodobnie tym, co masz w Linuksie), -bpobranie bajtów oznacza --apparent-sizeopcję. Nie tego chcesz użyć, aby uzyskać liczbę bajtów faktycznie używanych na dysku. Zamiast tego użyj --block-size=1lub -B 1.

Z GNU lsmożesz także zrobić ls -s --block-size=1na pliku. To da taki sam numer jak du -B 1dla pliku.


Przykład:

$ 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

Oznacza to, że jest to plik 512 MB, który zajmuje około 24 KB na dysku. Jest to rzadki plik (głównie zera, które w rzeczywistości nie są zapisywane na dysku, ale reprezentowane jako logiczne „dziury” w pliku). Pliki rzadkie są powszechne podczas pracy z wstępnie przydzielonymi dużymi plikami, np. Obrazami dysków dla maszyn wirtualnych lub plików wymiany itp. Tworzenie pliku rzadkiego jest szybkie, a wypełnianie go zerami jest powolne (i niepotrzebne).

Zobacz także instrukcję fallocatedotyczącą systemu Linux.

Kusalananda
źródło
w którym przypadku ta różnica jest ważna? czy możesz podać praktyczny przykład? z góry dziękuję.
D'Arcy Nader
1
@ D'ArcyNader Zobacz zaktualizowaną odpowiedź.
Kusalananda
Popraw mnie, jeśli coś źle zrozumiem, ale wydaje się, że pierwsze zdanie jest na odwrót: stackoverflow.com/a/31437673/3701431 du pokaże, ile danych można faktycznie odczytać, a jednocześnie lspokaże zakres przydzielonych sektorów dysku.
Sergiy Kolodyazhnyy
2
@SergiyKolodyazhnyy (przepraszam, że odpowiadam późno) Nie, dupokazuje ilość dysku faktycznie używanego przez plik, podczas gdy pozorny rozmiar (rozmiar logiczny) pokazany przez lsto liczbę bajtów, które program mógłby z niego odczytać. Jeśli plik jest rzadki, niektóre z odczytanych bajtów byłyby zerami, ale nadal byłyby dostarczane do programu, który je odczytuje (tylko nie z dysku).
Kusalananda
To była naprawdę dobra odpowiedź.
Lizardx
3

Otrzymuję rozmiar pliku w bajtach takich jak ten:

actualsize=$(du -b "${file}" | cut -f 1)
woohoo
źródło