Co to za „suma” w pierwszej linii po ls -l? [Zamknięte]

138

Jaki jest totalwynik ls -l?

    $ ls -l /etc
    total 3344
    -rw-r--r--   1 root root   15276 Oct  5  2004 a2ps.cfg
    -rw-r--r--   1 root root    2562 Oct  5  2004 a2ps-site.cfg
    drwxr-xr-x   4 root root    4096 Feb  2  2007 acpi
    -rw-r--r--   1 root root      48 Feb  8  2008 adjtime
    drwxr-xr-x   4 root root    4096 Feb  2  2007 alchemist
Sanket Sahu
źródło
Dlaczego to pytanie jest zamknięte? Nie sądzę, żeby to było „nie na temat”, co za arbitralna decyzja.
LIU Qingyuan

Odpowiedzi:

97

Definicję tej linii można znaleźć w lsdokumentacji swojej platformy. W przypadku coreutils ls(tego, który można znaleźć w wielu systemach Linux), informacje można znaleźć pod adresem info coreutils ls:

Dla każdego wymienionego katalogu należy poprzedzić pliki wierszem `total BLOCKS ', gdzie BLOCKS to całkowita alokacja dysku dla wszystkich plików w tym katalogu.

Mata
źródło
15
Co zabawne, man lsw moim systemie nie wspomina o tej linii, ale info coreutils lstak. Jak przychodzi man lsi info coreutils lsmasz różne informacje o tym samym poleceniu? Dlaczego nie jest lsudokumentowane tylko raz? Posiadanie dwóch różnych dokumentacji dla tego samego polecenia wydaje się być skonfigurowane do niepowodzenia.
HelloGoodbye,
1
infoDokumentacja coreutils jest często bardziej szczegółowa niż strony podręcznika systemowego. Dlatego na końcu każdej strony podręcznika mają notatkę odsyłającą do sekcji informacyjnej po więcej szczegółów.
Mat
7
Ach. Wykonałem info lsi dałem taki sam wynik jak info coreutils ls. Co robi ta kłótnia coreutils?
HelloGoodbye
47

Formuła: Co to jest , że liczba?

total int = Suma (physic_blocks_in_use) * physic_block_size / ls_block_size) dla każdego pliku.

Gdzie:

  • ls_block_sizejest dowolną zmienną środowiskową (zwykle 512 lub 1024 bajtów), którą można dowolnie modyfikować z włączoną --block-size=<int>flagą ls, POSIXLY_CORRECT=1zmienną środowiskową GNU (w celu uzyskania jednostek 512-bajtowych) lub-k flagą, która wymusza jednostki 1kB.
  • physical_block_sizejest zależną od systemu operacyjnego wartością wewnętrznego interfejsu bloku, który może, ale nie musi, być połączony z podstawowym sprzętem. Ta wartość wynosi zwykle 512b lub 1k, ale jest całkowicie zależna od systemu operacyjnego. Można to ujawnić poprzez %Bwartość na statlub fstat. Zauważ, że ta wartość (prawie zawsze) nie jest związana z liczbą fizycznych bloków na nowoczesnym urządzeniu magazynującym.

Dlaczego takie zagmatwane?

Ta liczba jest dość oderwana od wszelkich fizycznych lub znaczących wskaźników. Wielu młodszych programistów nie miało doświadczenia z dziurami w plikach lub dowiązaniami twardymi / sym . Ponadto dokumentacja dostępna na ten konkretny temat praktycznie nie istnieje.

Rozłączność i niejednoznaczność terminu „rozmiar bloku” jest wynikiem wielu różnych miar, które można łatwo pomylić, oraz stosunkowo głębokich poziomów abstrakcji obracających się wokół dostępu do dysku.

Przykłady sprzecznych informacji: du(lubls -s ) vs.stat

Uruchomienie du *w folderze projektu daje następujące efekty : (Uwaga: ls -szwraca te same wyniki).

dactyl:~/p% du *
2       check.cc
2       check.h
1       DONE
3       Makefile
3       memory.cc
5       memory.h
26      p2
4       p2.cc
2       stack.cc
14      stack.h

Razem : 2 + 2 + 1 + 3 + 3 + 5 + 26 + 4 + 2 + 14 = 62 bloki

Jednak biegając stat, widzimy inny zestaw wartości. Uruchomienie statw tym samym katalogu daje:

dactyl:~/p% stat * --printf="%b\t(%B)\t%n: %s bytes\n"
3       (512)   check.cc: 221 bytes
3       (512)   check.h: 221 bytes
1       (512)   DONE: 0 bytes
5       (512)   Makefile: 980 bytes
6       (512)   memory.cc: 2069 bytes
10      (512)   memory.h: 4219 bytes
51      (512)   p2: 24884 bytes
8       (512)   p2.cc: 2586 bytes
3       (512)   stack.cc: 334 bytes
28      (512)   stack.h: 13028 bytes

Razem: 3 + 3 + 1 + 5 + 6 + 10 + 51 + 8 + 3 + 28 = 118 bloków

Uwaga: Możesz użyć polecenia stat * --printf="%b\t(%B)\t%n: %s bytes\n">, aby wyprowadzić (w kolejności) liczbę bloków, (w parach) rozmiar tych bloków, nazwę pliku i rozmiar w bajtach, jak pokazano powyżej.

Istnieją dwie ważne rzeczy na wynos:

  • statzgłasza zarówno plik, jak physical_blocks_in_useiphysical_block_size jak zostały użyte w powyższym wzorze. Zauważ, że są to wartości oparte na interfejsach systemu operacyjnego.
  • duprzedstawia to, co jest ogólnie akceptowane, jako dość dokładne oszacowanie wykorzystania dysku fizycznego.

Dla odniesienia, oto ls -lkatalog powyżej:

dactyl:~/p% ls -l
**total 59**
-rw-r--r--. 1 dhs217 grad   221 Oct 16  2013 check.cc
-rw-r--r--. 1 dhs217 grad   221 Oct 16  2013 check.h
-rw-r--r--. 1 dhs217 grad     0 Oct 16  2013 DONE
-rw-r--r--. 1 dhs217 grad   980 Oct 16  2013 Makefile
-rw-r--r--. 1 dhs217 grad  2069 Oct 16  2013 memory.cc
-rw-r--r--. 1 dhs217 grad  4219 Oct 16  2013 memory.h
-rwxr-xr-x. 1 dhs217 grad 24884 Oct 18  2013 p2
-rw-r--r--. 1 dhs217 grad  2586 Oct 16  2013 p2.cc
-rw-r--r--. 1 dhs217 grad   334 Oct 16  2013 stack.cc
-rw-r--r--. 1 dhs217 grad 13028 Oct 16  2013 stack.h
Don Scott
źródło
27

To jest całkowita liczba bloków systemu plików, w tym bloków pośrednich, używanych przez wymienione pliki. Jeśli uruchomisz ls -ste same pliki i zsumujesz zgłoszone liczby, otrzymasz tę samą liczbę.

Dave Lasley
źródło
To po prostu nieprawda. Przykład: /bin/ls -s-> total 15 2 filename 3 filename2 3 filename3 3 filename4 2 filename5 2 filename6 2 filename8 2 filename9
Don Scott
3
Nie wiem, jaki system jesteś, ale dla mnie, to jest prawda. Przykład: gist.github.com/rfjakob/200f6001bf91cf801891
Jakob
@Jakob Opublikowano pełną odpowiedź, spójrz na nią i daj mi znać, jeśli to wyjaśni.
Don Scott
Nie jest to prawdą w przypadku Git bash dla systemu Windows.
thdoan
19

Wystarczy wspomnieć - możesz użyć -h (ls -lh), aby przekonwertować to na format czytelny dla człowieka.

Tsvetomir Dimitrov
źródło