จำนวนระหว่างการอนุญาตไฟล์และเจ้าของในเอาต์พุตคำสั่ง ls -l คืออะไร?


35

ผลลัพธ์ของls -lคำสั่งให้ผลลัพธ์ต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ฟิลด์หมายเลขระหว่างการอนุญาตไฟล์กับเจ้าของคืออะไร นั่นคือสิ่งที่ 1, 1, 1 และ 2คืออะไร? ฉันตรวจสอบแล้ว--helpแต่นั่นไม่ได้อธิบาย

[แก้ไข] ฉันคิดว่ามันเป็นจำนวนไฟล์ในไดเรกทอรี แต่ไม่ใช่ ดูภาพ "tempFolder" มี 3 ไฟล์ แต่ยังคงแสดง "2"

คำตอบ:


33

หมายเหตุ: แก้ไขหลังจากความคิดเห็น @StephaneChazelas

จำนวนแรกของการls -lส่งออกหลังจากบล็อกการอนุญาตคือจำนวนของการเชื่อมโยงอย่างหนักจำนวนการเชื่อมโยงอย่างหนัก

เป็นค่าเดียวกับที่ส่งคืนโดยstatคำสั่งใน "ลิงก์"

หมายเลขนี้คือจำนวนฮาร์ดลิงก์ของไฟล์เมื่ออ้างถึงไฟล์หรือจำนวนรายการไดเร็กทอรีที่มีอยู่เมื่ออ้างถึงไดเร็กทอรี

ไฟล์มักจะมีจำนวนการเชื่อมโยงอย่างหนักของ 1 แต่การเปลี่ยนแปลงนี้หากการเชื่อมโยงยากที่จะทำกับlnคำสั่ง ดูคู่มือ Debian อ้างอิง

ในตัวอย่างของคุณการเพิ่มฮาร์ดลิงก์สำหรับ tempFile2 จะเพิ่มจำนวนลิงค์:

ln -l
ln tempFile2 tempHardLink
ln -l

ทั้งtempFile2และtempHardLinkจะมีจำนวนลิงค์เป็น 2

หากคุณใช้แบบฝึกหัดเดียวกันกับลิงก์สัญลักษณ์ ( ln -s tempFile2 tempSymLink) ค่าการนับจะไม่เพิ่มขึ้น

ไดเรกทอรีจะมีจำนวนไม่ต่ำกว่า 2 '.'(การเชื่อมโยงไปเอง) และสำหรับรายการในไดเรกทอรีแม่ของ

ในตัวอย่างของคุณถ้าคุณต้องการเพิ่มจำนวนลิงค์ของtempFolderให้สร้างไดเรกทอรีใหม่และจำนวนจะเพิ่มขึ้น

ls -l tempFolder
mkdir tempFolder/anotherFolder
ls -l tempFolder

ลิงค์จากAnotherFolder / to tempFolder / (ซึ่งคือ..) จะถูกเพิ่มเข้าไปในการนับ



เนื่องจากมันจะแสดงระหว่างสิทธิ์และความเป็นเจ้าของคุณจะได้รับความประทับใจที่สำคัญมาก แต่ฉันไม่เคยใช้มัน โดยทั่วไปจำเป็นเมื่อใด
Emanuel Berg

1
นั่นไม่ถูกต้อง มันคือการนับลิงค์ระยะเวลา สำหรับไดเรกทอรีคุณมี 2 รายการในไดเรกทอรีหลัก (เช่นเดียวกับไฟล์ใด ๆ ) และ.รายการในตัวเองบวกหนึ่ง..รายการสำหรับรายการในแต่ละส่วนย่อย
Stéphane Chazelas

@StephaneChazelas เอกสารทั้งหมดที่ฉันได้พบพูดคุยเกี่ยวกับจำนวนฮาร์ดลิงก์ (ตัวอย่างเช่นlinuxgazette.net/issue35/tag/links.html ) นอกจากนี้ฉันพบว่าคำถามที่คล้ายกันถูกถามใน AskUbuntu ( askubuntu.com/questions/19510/… ) ฉันจะตรวจสอบซอร์สโค้ด coreutils และดูว่าฉันสามารถหาคำตอบที่แน่นอนได้หรือไม่
ดาเมียน

2
@EmanuelBerg เมื่อระบบไฟล์มีความน่าเชื่อถือน้อยกว่าตอนนี้และคุณกำลังทำงานกับระบบไฟล์ที่คุณพัฒนาขึ้นและlsสามารถใช้อักขระ 2 ตัวและให้ข้อมูลเพิ่มเติมแก่คุณและไม่มีstat(1)คำสั่งหรือfind(1)ไม่มีfsckและ symlink ก็อาจมากกว่า มีประโยชน์มากกว่าที่เป็นอยู่ในปัจจุบัน มันไม่สามารถเปลี่ยนแปลงได้โดยไม่ทำลายเชลล์สคริปต์ที่มีนักเขียนที่ผ่านมามีความยาวเป็น/dev/null; มันเป็นอย่างนั้นมาตั้งแต่อย่างน้อยปี 1979
msw

8

บน Unix โดยทั่วไปไฟล์เป็นรายการบางรายการในสารบัญ มีไฟล์หลายประเภท: ไฟล์ปกติ, อุปกรณ์, ลิงก์สัญลักษณ์, ประตู, ท่อ, ซ็อกเก็ต, ไดเรกทอรี ...

หมายเลขไอโหนด (ซึ่งคุณสามารถเห็นได้ในผลลัพธ์ls -i) เป็นดัชนีในตารางนั้น

ตอนนี้คุณทำไม่ได้ไฟล์การเข้าถึงโดยinodeแต่เส้นทาง เส้นทางเป็นห่วงโซ่ของไดเรกทอรีรายการ คุณจะสังเกตเห็นว่าเราไม่ได้พูดถึงโฟลเดอร์แต่เป็นไดเรกทอรีที่นี่ เพราะมันคือสิ่งที่เป็นไดเรกทอรี (คิดว่าสมุดโทรศัพท์)

ไดเร็กทอรีเป็นไฟล์ชนิดพิเศษที่ให้ชื่อแก่จำนวน inodes รายการไดเร็กทอรีคือการแม็พจากชื่อไปยัง inode

ไฟล์ที่กำหนด (inode) สามารถมีได้มากกว่าหนึ่งชื่อในหนึ่งไดเรกทอรี (เช่นเดียวกับที่มีมากกว่าหนึ่งชื่อที่หมายเลขโทรศัพท์) และยังสามารถมีชื่อ (รายการ) ในไดเรกทอรีมากกว่าหนึ่ง ลิงก์เหล่านั้นเรียกว่าลิงก์ซึ่งเรียกว่าฮาร์ดลิงก์เพื่อแยกความแตกต่างกับซอฟต์ลิงก์ (ไฟล์ชนิดพิเศษซึ่งเป็นตัวชี้ไปยังพา ธ )

ไฟล์ (inode) ติดตามจำนวนลิงก์ (ของรายการในไดเรกทอรีใด ๆ ) ที่มีดังนั้นเมื่อจำนวนถึง 0 (เมื่อมันถูกยกเลิกการเชื่อมโยงจากไดเรกทอรีสุดท้ายที่ถูกอ้างอิงใน) มันจะถูกจัดสรรคืน

นั่นคือหมายเลขนั้น (จำนวนลิงก์) ที่แสดงในls -lเอาต์พุต

เมื่อไฟล์ที่ไม่ใช่ไดเรกทอรีถูกสร้างขึ้นเป็นครั้งแรก (ที่มีopenหรือcreat(หรือbindหรือmknodบางประเภทของไฟล์) สายระบบ) ก็จะทำโดยการให้มีเส้นทางไปยังไฟล์ใหม่ (ชอบ"/a/b") สิ่งที่เกิดขึ้นคือไฟล์ใหม่และมีการจัดสรร inode และมีการเพิ่มรายการใหม่ในไดเรกทอรีที่เกี่ยวข้องกับ"a"ชื่อใน"/"ไดเรกทอรีราก นั่นคือลิงค์เริ่มต้นดังนั้นจำนวนลิงก์จึงเป็นหนึ่ง

สามารถเพิ่มลิงก์เพิ่มเติมได้ในภายหลังด้วยการlink()เรียกระบบ ( lnคำสั่ง) และลิงก์สามารถลบออกได้ด้วยการunlink()เรียกระบบ ( rmคำสั่ง)

คุณจะสังเกตเห็นว่าไฟล์ประเภทไดเรกทอรีโดยทั่วไปมีจำนวนลิงก์มากกว่าหรือเท่ากับ 2

ตอนนี้เมื่อคุณสร้างไดเรกทอรีคุณกำลังเรียกการโทรของmkdir()ระบบ mkdir("/a/b")สิ่งที่ชอบ สิ่งที่มันทำคือการจัดสรรไฟล์ใหม่ของไดเรกทอรีประเภท ในไดเรกทอรีใหม่นั้นมันจะสร้างสองรายการโดยอัตโนมัติ:

  • "."( จุดสำหรับไดเรกทอรี ) ซึ่งเป็นลิงค์ไปสู่ตัวมันเอง ดังนั้นการนับลิงก์จึงเป็น 1
  • ".."(สำหรับไดเรกทอรีของไดเรกทอรี ) "/a"ซึ่งเป็นเชื่อมโยงไปยัง ดังนั้นจำนวนลิงก์ของ"/a"จะเพิ่มขึ้นทีละหนึ่ง

จากนั้นไดเรกทอรีใหม่นั้นจะถูกลิงก์ไปยัง"/a"(มีการเพิ่มรายการไว้ใน"/a"นั้น) ดังนั้นการนับลิงก์จะเป็น 2 ในขณะนี้หากมี"/a/b/c"การสร้างไดเรกทอรีเนื่องจาก".."รายการใน"/a/b/c"การนับลิงก์"/a/b"จะกลายเป็น 3

Unices ส่วนใหญ่ จำกัด การสร้างลิงก์เพิ่มเติมไปยังไดเรกทอรีเนื่องจากอาจทำให้เกิดปัญหาได้ เมื่อพวกเขาอนุญาตlink()ในไดเรกทอรีโดยทั่วไป superuser เท่านั้นที่สามารถทำได้

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

ความจริงที่ว่าจำนวนลิงก์เป็นแบบดั้งเดิม 2 บวกกับจำนวนย่อยที่มีการใช้งาน ตัวอย่างเช่นใน:

find . -name '*.c' -print

หาก.ไม่มีส่วนย่อย แต่มีจำนวนไฟล์นับล้าน โดยการตรวจสอบการเชื่อมโยงของการนับ., findสามารถรู้ว่าไม่มี subdir ดังนั้นสิ่งที่findต้องทำคืออ่านเนื้อหาของไดเรกทอรีและรายงานรายการที่ลงท้ายด้วย.c(เช่นgrep '\.c$'ไฟล์ megabyte ไม่กี่ไฟล์, ไม่มีเรื่องใหญ่) มิฉะนั้นfindจะต้องตรวจสอบประเภทของไฟล์ทุกไฟล์เพื่อดูว่ามีไดเรกทอรีที่จะลงไปในนั้นหรือไม่ (ส่งผลให้หลาย ๆ ไฟล์ยังไม่จำเป็น)lstat()ไม่ แน่นอนว่าการเพิ่มประสิทธิภาพประเภทนี้ไม่สามารถใช้งานได้btrfs(แม้ว่าใน Linux รุ่นที่ทันสมัยประเภทของไฟล์จะถูกเก็บไว้ในรายการไดเรกทอรีสำหรับระบบไฟล์บางระบบ (รวมถึงbtrfs) และส่งคืนโดย thegetdents(2)เรียกระบบที่ใช้เพื่อเรียกรายการของรายการ ในไดเรกทอรีดังนั้นlstat


+1, คำตอบที่ยอดเยี่ยม :) จากการดูซอร์สโค้ด ls ฉันสังเกตเห็นว่าหมายเลขลิงก์นั้นได้รับการอัปเดตหลังจากการโทรถึงสถิติ ดังนั้นคำสั่ง stat จะให้ค่าลิงค์สำหรับไฟล์หรือไดเรกทอรี
ดาเมียน

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