จะบอกได้อย่างไรว่าไฟล์ใดเป็นไฟล์ดั้งเดิมหากสร้างฮาร์ดลิงก์


34

myold_fileตัวอย่างเช่นผมมีไฟล์ จากนั้นฉันใช้lnเพื่อสร้างฮาร์ดลิงก์เป็นmylink:

ln myold_file mylink

จากนั้นแม้จะใช้ls -aฉันก็ไม่สามารถบอกได้ว่าอันไหนเป็นอันเก่า

อย่างไรก็ตามมีการบอกหรือไม่?


2
การตอบโต้: ถ้าคุณทำls > a; ln a b; rm a; ln b cอันไหนจะ "ดั้งเดิมมากกว่า" อีกอัน? aหายไปคุณจะเหลือbและc...
glglgl

2
คุณพยายามทำอะไรให้สำเร็จ คุณพยายามทำอะไรให้สำเร็จ ไม่มี "ต้นฉบับ" เช่นนี้ ไฟล์เป็น inode ที่มีข้อมูลเมตาและชุดของบล็อกที่มีข้อมูล ไดเร็กทอรีสามารถมีลิงก์ไปยังไฟล์และลิงก์นี้คือชื่อไฟล์และหมายเลข inode คุณสามารถสร้างลิงค์จำนวนเท่าใดก็ได้ไปยังไฟล์ ไฟล์อาจไม่มีลิงก์น้อยกว่าหนึ่งรายการ
Johan

สำหรับคำอธิบายโดยละเอียดของคำตอบที่ยอมรับของคำถามนี้: ดูคำตอบที่ยอมรับของคำถามนั้น
Utku

คำตอบ:


93

คุณไม่สามารถเพราะพวกเขาเป็นไฟล์เดียวกันแท้จริงถึงโดยเส้นทางที่แตกต่างกัน คนแรกไม่มีสถานะพิเศษ


4
นี่คือคำตอบที่ถูกต้องชัดเจน: คำถามของ OP ขึ้นอยู่กับความเข้าใจผิด
Daniel Earwicker

8
@Adnan จริงแล้วไม่ใช่: ฮาร์ดลิงก์ทั้งสองนั้นเป็นไฟล์เดียวกัน รายการไดเรกทอรีต่างกัน คำศัพท์ของ Jenny D ถูกต้อง
Gilles 'หยุดความชั่วร้าย'

1
@Gilles ฉันไม่เห็นว่ามันถูกต้องได้อย่างไร สองเชื่อมโยงอย่างหนักไม่ได้สองไฟล์ ; ฮาร์ดลิงก์ไม่ใช่ไฟล์ มันชี้ไปที่ลิงก์ไปยังไฟล์เดียวกัน (ซึ่งเป็นตำแหน่งทางกายภาพบนดิสก์) บอกว่า "สองเชื่อมโยงอย่างหนักเป็นตัวอักษรไฟล์เดียวกัน" เป็นสิ่งที่ผิด
Adi

1
@ JennyD และนั่นก็เป็นวิธีเดียวที่ฉันได้ยิน "ฮาร์ดลิงก์" ถูกใช้งาน ตัวชี้ระบบไฟล์ไปยังไอโหนด ฉันคิดว่าพวกเราทุกคนผิดและถูก ฉันจะยุติการโต้เถียงเพราะไม่มีประโยชน์ ดูเหมือนว่าคำตอบของคุณจะถูกต้องสำหรับฉันคุณมี +1 จากฉันและฉันจะทิ้งมันไว้
Adi

5
การบอกว่าฮาร์ดลิงก์ "คือ" ไฟล์กำลังเปรียบเทียบสิ่งต่าง ๆ ในหมวดหมู่ต่าง ๆ ซึ่งไม่ถูกต้องทางเทคนิค แต่โดยทั่วไปแล้วเราจะพูดว่า " .bashrcเป็นไฟล์ที่มี ... " เมื่อเราหมายถึง "เส้นทางสัมพัทธ์.bashrcหมายถึงไฟล์ที่มี ... " นี่คือการรวมหมวดหมู่ทั่วไปและเราควรเข้าใจว่าเมื่อใดก็ตามที่อ้างถึง เส้นทางหรือรายการไดเรกทอรี "เป็น" ไฟล์เราหมายถึงไฟล์ที่อ้างถึง ด้วยความเข้าใจว่าฮาร์ดลิงก์สองตัวสามารถ "เป็น" ไฟล์เดียวกันได้ ปฏิเสธการประชุมนั้นในความโปรดปรานของภาษาที่เป็นทางการพวกเขาไม่สามารถ ทั้งสองท่ามีที่ของพวกเขา :-)
Steve Jessop

16

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

การสร้างฮาร์ดลิงก์เป็นการดำเนินการเขียนไปยังไดเร็กทอรีซึ่งมีลิงก์อยู่ mtimeดังนั้นมันจึงปรับปรุงของไดเรกทอรี ดังนั้นถ้า

  1. ลิงก์อยู่ในไดเรกทอรีที่ต่างกัน

  2. และคุณรู้ว่าไม่มีการเปลี่ยนแปลงไดเรกทอรีใด ๆ (เพิ่มไฟล์ลบเปลี่ยนชื่อหรือเปลี่ยนแปลงข้อมูลเมตาดาต้าไฟล์) หลังจากสร้างฮาร์ดลิงก์ที่สองจากนั้นคุณสามารถเปรียบเทียบmtimes ของไดเรกทอรีได้

กรณีพิเศษ: หากหนึ่งในไดเรกทอรีมีmtimeก่อนหน้าของไฟล์ (inode's) mtimeและคุณสามารถมั่นใจได้ว่าไฟล์นั้นไม่ได้ถูกเขียนหลังจากช่วงเวลาสั้น ๆ หลังจากการสร้างมันแล้วลิงก์ของไดเรกทอรีนี้จะเก่ากว่า

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

ls -lU

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


2
ไม่มีการเอ่ยถึง selinux, หลักฐานการตรวจสอบ, หรือการสอดแนมในเจอร์นัลของระบบไฟล์? smirkไม่มีหลักฐานการตรวจสอบไม่มีวิธีที่จะรู้ - สิ่งอื่นคือการเดาการ
Ricky Beam

1
@mikeserv หากคุณต้องการสอนคนอื่นด้วยวิธีนี้อย่างน้อยคุณควรเรียนรู้ที่จะพูดอย่างถูกต้อง ไม่ได้พูดว่า "ไฟล์ไหน" ในคำถาม และแม้ว่ามันจะเป็นเช่นนั้นนี่ก็เป็นเพียงปัญหาการใช้ถ้อยคำและโยนสมองบางส่วนที่เข้าใจคำถามจะเปิดเผยสิ่งที่เป็นจริงได้อย่างง่ายดาย
Hauke ​​Laging

4
ไดเรกทอรี mtime หลอกลวงจะทำงานหากสถานการณ์ถูกต้อง (ซึ่งหายาก) อย่างไรก็ตามวิธีที่คุณนำเสนอบางครั้งคุณจะได้ข้อสรุปที่ตรงกันข้าม mtime ของไดเรกทอรีเป็นเพียงตัวบ่งชี้ที่คุ้มค่าถ้ามันเท่ากับ ctime ของไฟล์ แต่ls -lUเคล็ดลับจะไม่ทำงานกับระบบไฟล์ที่ทันสมัย ​​(ext4, btrfs, zfs) มีรายการไม่ปรากฏขึ้นในลำดับการสร้างเลย
Gilles 'หยุดความชั่วร้าย'

2
@mikeserv - คำถามของ OP ขึ้นอยู่กับความเข้าใจผิด หากพวกเขาทำrm myold_fileแล้วmylinkจะยังคงมีอยู่และทำงานอย่างสมบูรณ์แบบเพราะมันเป็นรายการที่ดีพอ ๆ กันซึ่งอ้างถึง inode ที่เป็นพื้นฐาน เมื่อทั้งสองถูกลบแล้วระบบจะยกเลิกไอโหนด เมื่อใช้การเชื่อมโยงฮาร์ดเพื่อสร้างรายการระบบไฟล์สองรายการที่อ้างถึงไฟล์เดียวกันรายการเหล่านั้นจะเทียบเท่ากัน (โปรดทราบว่า "ไฟล์" ที่นี่หมายถึง "inode ที่เก็บข้อมูลสำหรับไฟล์ซึ่งตรงข้ามกับไดเรกทอรี) ดู: en.wikipedia.org/wiki/Inode
Daniel Earwicker

1
-1 เนื่องจากแม้ว่าข้อมูลเกี่ยวกับวิธีที่ไดเรกทอรีเปลี่ยนแปลงในบางระบบไฟล์เมื่ออัปเดตตารางคำตอบนี้ล้มเหลวในการล้างความเข้าใจผิดที่มีอยู่ในคำถามว่า "ไฟล์ต้นฉบับ" ไม่ใช่คุณสมบัติในกรณีของการเชื่อมโยงหลายตัว เพื่อ inode เดียว ในแง่ที่ว่าในขณะที่อยู่ในความน่าสนใจอย่างมากมันไม่ใช่สิ่งที่คนส่วนใหญ่เชื่อมโยงไปถึงคำถามนี้ควรเรียนรู้เกี่ยวกับแนวคิดพื้นฐานของฮาร์ดลิงก์ ปัญหานี้ไม่ได้เป็นการขาด "วิธีทำความสะอาดโดยตรงที่จะทำ" ปัญหาคือไม่มี "มัน"ในตอนแรก
Caleb

10

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

ฉันคิดว่าฉันกำลังทำสะดือบางอย่างเกี่ยวกับสาเหตุที่ฉันต้องรู้ว่ารายการไดเรกทอรีเก่าและวิธีการหลีกเลี่ยงที่จำเป็นต้องรู้ว่า


8

ฉันคิดว่าคำถามนี้ (ค่อนข้างสมเหตุสมผล) เข้าใจผิดว่าการเชื่อมโยงอย่างหนักคืออะไร แต่ผมคิดว่าถูกต้องที่สุดคำตอบโดยตรง'พวกเขาทั้งสองมี'

โดยปกติระบบไฟล์ Unix จะจัดเก็บเนื้อหาไฟล์และข้อมูลจริงใน i-nodes เหล่านี้ไม่มีเส้นทางใด ๆ เส้นทางจึงมีความสัมพันธ์แบบหนึ่งต่อหนึ่งกับ i-nodes เหล่านี้ ลองเปรียบเทียบคนที่มีสองชื่อคือ Bob และ Joe ไม่มีใครบอกได้ว่าบ๊อบมีอายุมากกว่าโจหรือในทางกลับกันพวกเขาเป็นเพียงชื่อของบุคคลคนเดียวกัน

หากคุณต้องการรักษาแนวคิดของไฟล์ 'ดั้งเดิม' และไฟล์ใหม่ที่คุณกำลังมองหาลิงก์สัญลักษณ์แทนสิ่งเหล่านี้เป็นนามแฝงมากกว่าเพียงแค่คำแนะนำเกี่ยวกับระบบปฏิบัติการที่ควรดำเนินการในเส้นทางเดียวราวกับว่าพวกเขา เป็นคนอื่นโดยไม่ต้องเปลี่ยนโครงสร้างไฟล์ภายใต้ (คุณสามารถสร้างได้ด้วย "ลิงก์ไฟล์ ln -s"


คุณรู้ไหมบ๊อบ / โจจะอ่อนไหวกับอายุของเขามาก ... การเปรียบเทียบลิ้งค์ / ซอฟต์นั้นดีมาก - โดยเฉพาะอย่างยิ่งเมื่อคุณพิจารณาว่าฮาร์ดลิงค์จะเพิ่งได้รับการเพิ่มเข้าไปในไฟล์ไดเรกทอรีซึ่งมีอยู่แล้ว inode - แต่ soft-link เป็นไฟล์ที่อยู่ในสิทธิของตนเองและดังนั้นจึงถูกกำหนด inode ของตัวเอง อย่างไรก็ตามในทั้งสองกรณีเวลาในการแก้ไขจะมีความเกี่ยวข้องกับไฟล์ที่เชื่อมโยงเท่านั้นเนื่องจากการปรับเปลี่ยนเพียงอย่างเดียวที่สามารถทำได้กับลิงก์ที่มีความสำคัญใด ๆ ก็คือการสร้าง / ลบ
mikeserv

2

ปมของคำตอบที่ได้รับจากคนอื่น ๆ หลายคนข้างต้นคือทุกชื่อไฟล์เป็นฮาร์ดลิงก์ไปยังไฟล์ ไม่มีต้นฉบับจริงอาจจะเป็นคนแรก

คิดว่าไดเรกทอรีเป็นตารางที่แสดงชื่อไฟล์และหมายเลข inode

ฮาร์ดลิงก์ทุกอันรวมถึงลิงค์แรกคือรายการในไดเรกทอรีที่กำหนด "ชื่อไฟล์" ให้กับหมายเลขไอโหนดเพื่อให้คุณสามารถเข้าถึงไฟล์ด้วยชื่อนั้น

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

การเข้าถึงข้อมูลของไฟล์ผ่านชื่อไฟล์เป็นกระบวนการสามขั้นตอน: ชื่อไฟล์จะถูกค้นหาในไดเรกทอรีเพื่อรับหมายเลข inode จากนั้นไอโหนดจะถูกอ้างถึงเพื่อค้นหาบล็อกดิสก์ที่เกี่ยวข้อง (หรือบล็อก) ที่มีข้อมูล ในที่สุดบล็อกเหล่านั้นจะถูกอ่าน / เขียน

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

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