"ผลรวม" ในบรรทัดแรกหลัง ls -l คืออะไร [ปิด]


132

อะไรคือสิ่งที่totalอยู่ในการส่งออกของ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

คำตอบ:


94

คุณสามารถค้นหาคำจำกัดความของบรรทัดนั้นได้ในlsเอกสารสำหรับแพลตฟอร์มของคุณ สำหรับcoreutils ls(สิ่งที่พบในระบบ Linux จำนวนมาก) สามารถดูข้อมูลได้ทางinfo coreutils ls:

สำหรับแต่ละไดเร็กทอรีที่อยู่ในรายการให้นำหน้าไฟล์ด้วยบรรทัด `` total BLOCKS 'โดยที่ BLOCKS คือการจัดสรรดิสก์ทั้งหมดสำหรับไฟล์ทั้งหมดในไดเร็กทอรีนั้น


14
น่าสนุกพอman lsในระบบของฉันไม่ได้พูดถึงบรรทัดนั้น แต่info coreutils lsทำ คำสั่งเดียวกันมีที่มาอย่างไรman lsและinfo coreutils lsมีข้อมูลที่แตกต่างกันอย่างไร เหตุใดจึงไม่มีการlsจัดทำเป็นเอกสารเพียงครั้งเดียว การมีเอกสารสองชุดที่แตกต่างกันสำหรับคำสั่งเดียวกันดูเหมือนว่าตั้งค่าไว้สำหรับความล้มเหลว
HelloGoodbye

1
infoเอกสารสำหรับเนื้อหาของ coreutils มักมีรายละเอียดมากกว่าหน้าคน นั่นเป็นเหตุผลที่พวกเขามีหมายเหตุที่ท้ายหน้าแต่ละหน้าเพื่อบอกคุณในส่วนข้อมูลสำหรับรายละเอียดเพิ่มเติม
จ้า

7
อา. ฉันดำเนินการinfo lsและให้ผลลัพธ์เช่นเดียวกับinfo coreutils ls. อาร์กิวเมนต์coreutilsทำอะไร?
HelloGoodbye

46

สูตร: ตัวเลขนั้นคืออะไร?

total int = ผลรวมของ(physical_blocks_in_use) * physical_block_size / ls_block_size)สำหรับแต่ละไฟล์

ที่ไหน:

  • ls_block_sizeเป็นตัวแปรสภาพแวดล้อมโดยพลการ (ปกติ 512 หรือ 1024 bytes) ซึ่งเป็นอิสระที่สามารถแก้ไขได้ด้วย --block-size=<int>ธงlsที่POSIXLY_CORRECT=1ตัวแปรสภาพแวดล้อมของกนู (ที่จะได้รับหน่วย 512 ไบต์) หรือ-kธงที่จะบังคับให้หน่วย 1KB
  • physical_block_sizeเป็นค่าที่ขึ้นกับระบบปฏิบัติการของอินเทอร์เฟซบล็อกภายในซึ่งอาจเชื่อมต่อกับฮาร์ดแวร์พื้นฐานหรือไม่ก็ได้ ค่านี้ปกติคือ 512b หรือ 1k แต่ขึ้นอยู่กับ OS โดยสมบูรณ์ มันสามารถนำมาเปิดเผยผ่าน%Bค่าหรือ stat โปรดทราบว่าค่านี้ (เกือบตลอดเวลา) ไม่เกี่ยวข้องกับจำนวนบล็อกทางกายภาพบนอุปกรณ์จัดเก็บข้อมูลสมัยใหม่fstat

ทำไมจึงสับสน?

ตัวเลขนี้ค่อนข้างแยกออกจากเมตริกทางกายภาพหรือที่มีความหมาย โปรแกรมเมอร์จูเนียร์หลายคนไม่ได้มีประสบการณ์กับหลุมไฟล์หรือยาก / การเชื่อมโยง นอกจากนี้เอกสารที่มีอยู่ในหัวข้อเฉพาะนี้แทบไม่มีอยู่จริง

ความไม่ปะติดปะต่อและความคลุมเครือของคำว่า"ขนาดบล็อก"เป็นผลมาจากมาตรการต่างๆมากมายทำให้สับสนได้ง่ายและระดับนามธรรมที่ค่อนข้างลึกซึ่งวนเวียนอยู่กับการเข้าถึงดิสก์

ตัวอย่างข้อมูลที่ขัดแย้งกัน: du(หรือls -s) เทียบกับstat

การรันdu *ในโฟลเดอร์โปรเจ็กต์จะให้ผลลัพธ์ดังต่อไปนี้: (หมายเหตุ: ls -sส่งกลับผลลัพธ์เดียวกัน)

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

รวม : 2 + 2 + 1 + 3 + 3 + 5 + 26 + 4 + 2 + 14 = 62 บล็อก

แต่เมื่อมีการเรียกใช้statเราจะเห็นชุดของค่าที่แตกต่างกัน การรันstatในไดเร็กทอรีเดียวกันให้ผล:

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

รวม: 3 + 3 + 1 + 5 + 6 + 10 + 51 + 8 + 3 + 28 = 118 บล็อก

หมายเหตุ:คุณสามารถใช้คำสั่งstat * --printf="%b\t(%B)\t%n: %s bytes\n"> เพื่อส่งออก (ตามลำดับ) จำนวนบล็อก (ใน parens) ขนาดของบล็อกเหล่านั้นชื่อของไฟล์และขนาดเป็นไบต์ดังที่แสดงด้านบน

มีประเด็นสำคัญสองประการ:

  • statรายงานทั้งphysical_blocks_in_useและphysical_block_sizeตามที่ใช้ในสูตรด้านบน โปรดทราบว่าค่าเหล่านี้ขึ้นอยู่กับอินเทอร์เฟซของระบบปฏิบัติการ
  • duเป็นการให้สิ่งที่ยอมรับกันโดยทั่วไปว่าเป็นการประมาณการการใช้งานดิสก์ทางกายภาพที่ถูกต้อง

สำหรับการอ้างอิงนี่คือls -lไดเรกทอรีของด้านบน:

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

26

นั่นคือจำนวนบล็อกระบบไฟล์ทั้งหมดรวมถึงบล็อกทางอ้อมที่ใช้โดยไฟล์ในรายการ หากคุณเรียกใช้ls -sไฟล์เดียวกันและรวมตัวเลขที่รายงานคุณจะได้รับหมายเลขเดียวกันนั้น


สิ่งนี้ไม่เป็นความจริง ตัวอย่าง: /bin/ls -s-> total 15 2 filename 3 filename2 3 filename3 3 filename4 2 filename5 2 filename6 2 filename8 2 filename9
Don Scott

3
ฉันไม่รู้ว่าคุณใช้ระบบอะไร แต่สำหรับฉันมันคือเรื่องจริง ตัวอย่าง: gist.github.com/rfjakob/200f6001bf91cf801891
Jakob

@Jakob โพสต์คำตอบแบบเต็มลองดูและแจ้งให้เราทราบหากเคลียร์ได้
Don Scott

สิ่งนี้ไม่เป็นความจริงใน Git bash สำหรับ Windows
ถึง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.