Apa itu "total" di baris pertama setelah ls-l? [Tutup]

131

Apa yang ada totaldi output 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
sumber

Jawaban:

94

Anda dapat menemukan definisi baris itu dalam lsdokumentasi untuk platform Anda. Untuk coreutils ls(yang ditemukan di banyak sistem Linux), informasi dapat ditemukan melalui info coreutils ls:

Untuk setiap direktori yang terdaftar, kata pengantar file dengan baris `total BLOCKS ', di mana BLOCKS adalah total alokasi disk untuk semua file di direktori itu.

Tikar
sumber
14
Lucunya, man lspada sistem saya tidak menyebutkan garis itu, tetapi info coreutils lstidak. Bagaimana bisa man lsdan info coreutils lsada informasi berbeda tentang perintah yang sama? Mengapa tidak lsdidokumentasikan sekali saja? Memiliki dua dokumentasi berbeda untuk perintah yang sama sepertinya diatur untuk kegagalan.
HelloGoodbye
1
infodokumen untuk hal-hal coreutils seringkali lebih rinci daripada halaman manual. Itu sebabnya mereka memiliki catatan di akhir setiap halaman manual yang merujuk Anda ke bagian info untuk detail lebih lanjut.
Mat
7
Ah. Saya dieksekusi info lsdan itu untuk memberikan output yang sama dengan info coreutils ls. Apa yang dilakukan argumen coreutils?
HelloGoodbye
46

Formula: Apa yang nomor?

total int = Jumlah (physical_blocks_in_use) * physical_block_size / ls_block_size) untuk setiap file.

Dimana:

  • ls_block_sizeadalah variabel lingkungan sewenang - wenang (biasanya 512 atau 1024 byte) yang dapat dimodifikasi secara bebas dengan --block-size=<int>tanda aktif ls, POSIXLY_CORRECT=1variabel lingkungan GNU (untuk mendapatkan unit 512-byte), atau -kbendera untuk memaksa unit 1kB.
  • physical_block_sizeadalah nilai tergantung OS dari antarmuka blok internal, yang mungkin atau mungkin tidak terhubung ke perangkat keras yang mendasarinya. Nilai ini biasanya 512b atau 1k, tetapi sepenuhnya tergantung pada OS. Itu bisa diungkapkan melalui %Bnilai pada statatau fstat. Perhatikan bahwa nilai ini (hampir selalu) tidak terkait dengan jumlah blok fisik pada perangkat penyimpanan modern .

Kenapa begitu membingungkan?

Angka ini cukup terlepas dari metrik fisik atau bermakna. Banyak programmer junior belum memiliki pengalaman dengan lubang file atau tautan hard / sym . Selain itu, dokumentasi yang tersedia tentang topik khusus ini sebenarnya tidak ada.

Ketidakberpihakan dan ambiguitas dari istilah "ukuran blok" adalah akibat dari berbagai langkah yang mudah dikacaukan, dan tingkat abstraksi yang relatif dalam berkisar pada akses disk.

Contoh informasi yang saling bertentangan: du(atau ls -s) vs.stat

Menjalankan du *dalam folder proyek menghasilkan yang berikut: (Catatan: ls -smengembalikan hasil yang sama.)

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

Total : 2 + 2 + 1 + 3 + 3 + 5 + 26 + 4 + 2 + 14 = 62 Blok

Namun ketika seseorang berlari statkita melihat serangkaian nilai yang berbeda. Berjalan statdi direktori yang sama menghasilkan:

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

Total: 3 + 3 + 1 + 5 + 6 + 10 + 51 + 8 + 3 + 28 = 118 Blok

Catatan: Anda dapat menggunakan perintah stat * --printf="%b\t(%B)\t%n: %s bytes\n"> untuk menampilkan (dalam urutan) jumlah blok, (dalam parens) ukuran blok itu, nama file, dan ukuran dalam byte, seperti yang ditunjukkan di atas.

Ada dua hal penting yang harus diperhatikan:

  • statmelaporkan kedua physical_blocks_in_usedan physical_block_sizeseperti yang digunakan dalam rumus di atas. Perhatikan bahwa ini adalah nilai berdasarkan antarmuka OS.
  • dumenyediakan apa yang secara umum diterima sebagai perkiraan yang cukup akurat untuk pemanfaatan disk fisik.

Untuk referensi, berikut adalah ls -ldirektori di atas:

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
sumber
26

Itu adalah jumlah total blok sistem file, termasuk blok tidak langsung, yang digunakan oleh file yang terdaftar. Jika Anda menjalankan ls -sfile yang sama dan menjumlahkan angka yang dilaporkan, Anda akan mendapatkan nomor yang sama.

Dave Lasley
sumber
Ini tidak benar. Contoh: /bin/ls -s-> total 15 2 filename 3 filename2 3 filename3 3 filename4 2 filename5 2 filename6 2 filename8 2 filename9
Don Scott
3
Saya tidak tahu sistem apa yang Anda berada di, tapi bagi saya, itu adalah benar. Contoh: gist.github.com/rfjakob/200f6001bf91cf801891
Jakob
@ Jakob memposting jawaban lengkap, lihatlah dan beri tahu saya jika sudah jelas.
Don Scott
Ini tidak benar di Git bash untuk Windows.
thdoan
18

Sebagai tambahan - Anda dapat menggunakan -h (ls -lh) untuk mengonversinya dalam format yang dapat dibaca manusia.

Tsvetomir Dimitrov
sumber