myold_file
ตัวอย่างเช่นผมมีไฟล์ จากนั้นฉันใช้ln
เพื่อสร้างฮาร์ดลิงก์เป็นmylink
:
ln myold_file mylink
จากนั้นแม้จะใช้ls -a
ฉันก็ไม่สามารถบอกได้ว่าอันไหนเป็นอันเก่า
อย่างไรก็ตามมีการบอกหรือไม่?
myold_file
ตัวอย่างเช่นผมมีไฟล์ จากนั้นฉันใช้ln
เพื่อสร้างฮาร์ดลิงก์เป็นmylink
:
ln myold_file mylink
จากนั้นแม้จะใช้ls -a
ฉันก็ไม่สามารถบอกได้ว่าอันไหนเป็นอันเก่า
อย่างไรก็ตามมีการบอกหรือไม่?
คำตอบ:
คุณไม่สามารถเพราะพวกเขาเป็นไฟล์เดียวกันแท้จริงถึงโดยเส้นทางที่แตกต่างกัน คนแรกไม่มีสถานะพิเศษ
.bashrc
เป็นไฟล์ที่มี ... " เมื่อเราหมายถึง "เส้นทางสัมพัทธ์.bashrc
หมายถึงไฟล์ที่มี ... " นี่คือการรวมหมวดหมู่ทั่วไปและเราควรเข้าใจว่าเมื่อใดก็ตามที่อ้างถึง เส้นทางหรือรายการไดเรกทอรี "เป็น" ไฟล์เราหมายถึงไฟล์ที่อ้างถึง ด้วยความเข้าใจว่าฮาร์ดลิงก์สองตัวสามารถ "เป็น" ไฟล์เดียวกันได้ ปฏิเสธการประชุมนั้นในความโปรดปรานของภาษาที่เป็นทางการพวกเขาไม่สามารถ ทั้งสองท่ามีที่ของพวกเขา :-)
ไม่มีวิธีโดยตรงที่สะอาดและเชื่อถือได้ แต่ภายใต้สถานการณ์ที่เหมาะสมอาจเป็นไปได้ (หรืออย่างน้อยน่าจะเป็น) ปัญหาคือมีฮาร์ดลิงก์สองตัว แต่มีเพียงไฟล์เดียว เปลี่ยนแก้ไขและ (อาจ) เวลาสร้างจะถูกเก็บไว้สำหรับไฟล์ (inodes) เท่านั้น แต่ไม่ได้สำหรับรายการไดเรกทอรี (ฮาร์ดลิงก์) ดังนั้นข้อมูลที่คุณต้องการสามารถนำมาจากเอฟเฟกต์รองเท่านั้นซึ่งสามารถทำลายได้ง่ายโดยการดำเนินการที่ไม่เกี่ยวข้องกับไฟล์ และคุณไม่สามารถดูได้ว่ามันถูกทำลายไปแล้วหรือยัง คุณสามารถรู้ได้ว่าจากสถานการณ์การปฏิบัติงานหากคุณตระหนักถึงพวกเขาอย่างแม่นยำ
การสร้างฮาร์ดลิงก์เป็นการดำเนินการเขียนไปยังไดเร็กทอรีซึ่งมีลิงก์อยู่ mtime
ดังนั้นมันจึงปรับปรุงของไดเรกทอรี ดังนั้นถ้า
ลิงก์อยู่ในไดเรกทอรีที่ต่างกัน
และคุณรู้ว่าไม่มีการเปลี่ยนแปลงไดเรกทอรีใด ๆ (เพิ่มไฟล์ลบเปลี่ยนชื่อหรือเปลี่ยนแปลงข้อมูลเมตาดาต้าไฟล์) หลังจากสร้างฮาร์ดลิงก์ที่สองจากนั้นคุณสามารถเปรียบเทียบmtime
s ของไดเรกทอรีได้
กรณีพิเศษ: หากหนึ่งในไดเรกทอรีมีmtime
ก่อนหน้าของไฟล์ (inode's) mtime
และคุณสามารถมั่นใจได้ว่าไฟล์นั้นไม่ได้ถูกเขียนหลังจากช่วงเวลาสั้น ๆ หลังจากการสร้างมันแล้วลิงก์ของไดเรกทอรีนี้จะเก่ากว่า
หากลิงก์อยู่ในไดเรกทอรีเดียวกัน (ซึ่งเป็นกรณีของคำถามของคุณ) ก็จะยิ่งแย่ลง จากนั้นคุณสามารถใช้
ls -lU
เพื่อให้ได้รับความประทับใจในลำดับที่มีการสร้างรายการ ไม่จำเป็นต้องเป็นลำดับที่ถูกต้องเนื่องจากอาจลบรายการเพื่อให้มีการสร้างรายการใหม่ตรงกลางรายการไดเรกทอรี และเมื่อกิลส์ชี้ให้เห็นมันก็ไม่ได้ผลกับระบบไฟล์รุ่นใหม่
ls -lU
เคล็ดลับจะไม่ทำงานกับระบบไฟล์ที่ทันสมัย (ext4, btrfs, zfs) มีรายการไม่ปรากฏขึ้นในลำดับการสร้างเลย
rm myold_file
แล้วmylink
จะยังคงมีอยู่และทำงานอย่างสมบูรณ์แบบเพราะมันเป็นรายการที่ดีพอ ๆ กันซึ่งอ้างถึง inode ที่เป็นพื้นฐาน เมื่อทั้งสองถูกลบแล้วระบบจะยกเลิกไอโหนด เมื่อใช้การเชื่อมโยงฮาร์ดเพื่อสร้างรายการระบบไฟล์สองรายการที่อ้างถึงไฟล์เดียวกันรายการเหล่านั้นจะเทียบเท่ากัน (โปรดทราบว่า "ไฟล์" ที่นี่หมายถึง "inode ที่เก็บข้อมูลสำหรับไฟล์ซึ่งตรงข้ามกับไดเรกทอรี) ดู: en.wikipedia.org/wiki/Inode
หากคุณใช้เวลาในการปรับเปลี่ยนครั้งล่าสุดของไดเรกทอรีและคุณไม่มีความรู้เกี่ยวกับวิธีการและเวลาที่ไดเรกทอรีเหล่านั้นมีการเปลี่ยนแปลงการพึ่งพา mtime จะทำให้คุณผิดร้อยละของเวลา ปัญหาที่นี่คือไฟล์ถูกแสดงในระบบแฟ้มโดย inode ไม่ใช่โดยรายการไดเรกทอรี รายการไดเร็กทอรี (ชื่อไฟล์) ชี้ไปที่ inode ไม่ใช่ไฟล์
ฉันคิดว่าฉันกำลังทำสะดือบางอย่างเกี่ยวกับสาเหตุที่ฉันต้องรู้ว่ารายการไดเรกทอรีเก่าและวิธีการหลีกเลี่ยงที่จำเป็นต้องรู้ว่า
ฉันคิดว่าคำถามนี้ (ค่อนข้างสมเหตุสมผล) เข้าใจผิดว่าการเชื่อมโยงอย่างหนักคืออะไร แต่ผมคิดว่าถูกต้องที่สุดคำตอบโดยตรง'พวกเขาทั้งสองมี'
โดยปกติระบบไฟล์ Unix จะจัดเก็บเนื้อหาไฟล์และข้อมูลจริงใน i-nodes เหล่านี้ไม่มีเส้นทางใด ๆ เส้นทางจึงมีความสัมพันธ์แบบหนึ่งต่อหนึ่งกับ i-nodes เหล่านี้ ลองเปรียบเทียบคนที่มีสองชื่อคือ Bob และ Joe ไม่มีใครบอกได้ว่าบ๊อบมีอายุมากกว่าโจหรือในทางกลับกันพวกเขาเป็นเพียงชื่อของบุคคลคนเดียวกัน
หากคุณต้องการรักษาแนวคิดของไฟล์ 'ดั้งเดิม' และไฟล์ใหม่ที่คุณกำลังมองหาลิงก์สัญลักษณ์แทนสิ่งเหล่านี้เป็นนามแฝงมากกว่าเพียงแค่คำแนะนำเกี่ยวกับระบบปฏิบัติการที่ควรดำเนินการในเส้นทางเดียวราวกับว่าพวกเขา เป็นคนอื่นโดยไม่ต้องเปลี่ยนโครงสร้างไฟล์ภายใต้ (คุณสามารถสร้างได้ด้วย "ลิงก์ไฟล์ ln -s"
ปมของคำตอบที่ได้รับจากคนอื่น ๆ หลายคนข้างต้นคือทุกชื่อไฟล์เป็นฮาร์ดลิงก์ไปยังไฟล์ ไม่มีต้นฉบับจริงอาจจะเป็นคนแรก
คิดว่าไดเรกทอรีเป็นตารางที่แสดงชื่อไฟล์และหมายเลข inode
ฮาร์ดลิงก์ทุกอันรวมถึงลิงค์แรกคือรายการในไดเรกทอรีที่กำหนด "ชื่อไฟล์" ให้กับหมายเลขไอโหนดเพื่อให้คุณสามารถเข้าถึงไฟล์ด้วยชื่อนั้น
ไฟล์คือชุดของบล็อกบนดิสก์จัดการและติดตามโดยข้อมูลเมตาที่เก็บไว้ในไอโหนด ไฟล์มีหมายเลขไอโหนดหนึ่ง
การเข้าถึงข้อมูลของไฟล์ผ่านชื่อไฟล์เป็นกระบวนการสามขั้นตอน: ชื่อไฟล์จะถูกค้นหาในไดเรกทอรีเพื่อรับหมายเลข inode จากนั้นไอโหนดจะถูกอ้างถึงเพื่อค้นหาบล็อกดิสก์ที่เกี่ยวข้อง (หรือบล็อก) ที่มีข้อมูล ในที่สุดบล็อกเหล่านั้นจะถูกอ่าน / เขียน
ดังนั้นการนำกลับบ้านจากทุกอย่างที่เป็นแบบนี้: ไม่มีความแตกต่างระหว่างการเข้าถึงเนื้อหาไฟล์โดยใช้ครั้งแรก ("ดั้งเดิม") หรือลิงก์ที่สร้างขึ้นในภายหลัง
ls > a; ln a b; rm a; ln b c
อันไหนจะ "ดั้งเดิมมากกว่า" อีกอัน?a
หายไปคุณจะเหลือb
และc
...