Jaka jest różnica między du -h a ls -lh?

31

Trudno mi zrozumieć, jaki jest właściwy sposób odczytu rozmiaru plików, ponieważ każde polecenie daje różne wyniki. Natknąłem się również na post na http://forums.devshed.com/linux-help-33/du-and-ls-generating-inconsistent-file-sizes-42169.html, który stwierdza, co następuje;

du podaje rozmiar pliku znajdującego się w systemie plików. (IE zawsze da wynik podzielny przez 1024).

ls da ci rzeczywisty rozmiar pliku.

To, na co patrzysz, to różnica między faktycznym rozmiarem pliku a ilością miejsca na dysku, którą zajmuje. (zwana także wydajnością systemu plików).

Jaka jest różnica między tym, jak rezyduje on w systemie plików, a faktycznym rozmiarem pliku

PeanutsMonkey
źródło

Odpowiedzi:

48

Jest to tak zwane luka :

Każda warstwa abstrakcji na wierzchu poszczególnych bitów i bajtów powoduje marnowanie miejsca, gdy plik danych jest mniejszy niż najmniejsza jednostka danych, którą system plików może śledzić. To zmarnowane miejsce w sektorze, klastrze lub bloku jest powszechnie określane jako luka i zwykle nie można go wykorzystać do przechowywania dodatkowych danych. Dla pojedynczych sektorów 256-bajtowych maksymalna ilość zmarnowanego miejsca wynosi 255 bajtów. Dla klastrów 64 kilobajtów maksymalna zmarnowana przestrzeń wynosi 65 535 bajtów.

Tak więc, jeśli twój system plików przydziela miejsce w jednostkach 64 KB, a Ty przechowujesz plik 3 KB, to:

  • rzeczywisty rozmiar pliku to 3 KB.
  • rozmiar rezydentny pliku wynosi 64 KB, ponieważ pozostałych 61 KB w tej jednostce nie można przypisać do innego pliku, w związku z czym zostaje utracony.

Uwaga : Niektóre systemy plików obsługują subalokację bloków , co pomaga złagodzić ten problem poprzez przypisanie wielu małych plików (lub tylnych końców dużych plików) do tego samego bloku.

Złota rączka 5
źródło
1
To jedno cholernie dobre wytłumaczenie.
SpacemanSpiff
1
@ Handyman5 - Thanks Handyman5. Więc kiedy patrzę na rozmiar pliku lub folderu za pomocą ls, zwraca rzeczywisty rozmiar, a du zwraca rozmiar rezydenta? Czy to jest poprawne? Więc kiedy patrzymy na rozmiar pliku, który jest najdokładniejszy, tj. Rozmiar rezydenta lub rozmiar pliku, czy jest to pytanie arbitralne?
PeanutsMonkey
8
@PeanutsMonkey, dokładność zależy od obserwatora. ;-) Zasadniczo, jeśli martwisz się, ile miejsca plik zająłby gdzie indziej (np. Kopiowanie przez sieć, dodawanie do pliku zip, tworzenie kopii zapasowej na dysku zewnętrznym itp.), To rzeczywisty rozmiar to troszczysz się o. Jeśli martwisz się ilością miejsca pozostałego na dysku, na którym znajduje się teraz plik, zależy Ci na rozmiarze rezydenta. Ponieważ dupokazuje ci disk umędrca, patrzy na miejsce zajmowane na bieżącym dysku, a tym samym pokazuje rozmiar rezydenta.
Złota rączka 5
1
@ Handyman5 - minął prawie rok po poście, ale jestem ciekawy, jak powyższa odpowiedź różni się podczas używania df -h?
PeanutsMonkey,
1
dfzgłasza liczbę pozostałych bloków * rozmiar bloku systemu plików. W tym przypadku byłoby to bardziej podobne du, ponieważ nawet częściowo wykorzystane bloki są uważane za w pełni przydzielone. dfw zasadzie tłumaczy statvfs , więc możesz spojrzeć na to wywołanie systemowe, aby uzyskać lepszy obraz tego, co się dzieje.
Złota rączka 5
19

Jest jeszcze jedna opcja, która nie została omówiona - rzadkie pliki . W tym przypadku, dupokaże mniejszy rozmiar niż proste ls -lbędzie, ponieważ lsjest zgłoszenie „wielkość” pliku jako bycia pozorna wielkość (liczba bajtów można odczytać, jeśli całe mnóstwo zer chciał), natomiast duwola nadal używaj rzeczywistej liczby używanych bloków dysku.

Zabawna sztuczka: utwórz wiele dużych, rzadkich plików, a następnie zaimponuj znajomym, ile masz miejsca na dysku („spójrz, przechowuję jedenaście gazillionów 1 TB plików na moim dysku twardym!”). OK, może nie tak fajnie.

womble
źródło
6

Systemy plików składają się z bloków. Pliki nie muszą dobrze pasować do bloków. Jeśli plik miałby 1024 bajty, jego rozmiar w ls i du wynosiłby 1024. Jeśli rozmiar pliku to 1025, rozmiar wynosiłby 1025 w ls i 2048 w du.

Zwróć uwagę, że powyższy przykład zakłada rozmiar bloku 1024. Większe rozmiary bloków są obecnie normą e, g,

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

du -h fred
8.0K    fred
Iain
źródło
0

Jest jeszcze jeden powód, dla którego mogą się różnić. du -h wie, kiedy widzi ten sam plik pod inną nazwą (twarde linki, w przeciwieństwie do dowiązań symbolicznych) i zgłasza każdy plik pod względem rozmiaru, ale dodaje rozmiar tylko raz do wspólnego katalogu nadrzędnego.

Clifford Heath
źródło