ฮาร์ดลิงก์นับเป็นไฟล์ปกติหรือไม่


21

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

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

นอกจากนี้หากไฟล์เหล่านั้นถูกพิจารณาว่าเป็นไฟล์ปกติก็มีวิธีตรวจสอบว่าไฟล์เหล่านี้เชื่อมโยงกันอย่างหนักหรือไม่โดยไม่ต้องแยกวิเคราะห์ls -i? และมีวิธีการตรวจสอบว่าไฟล์โดยพลการบางไฟล์, X, เชื่อมโยงกับไฟล์โดยพลการอื่น ๆ , Y, โดยไม่ใช้find -iคำสั่งหรือไม่?


5
ด้วยฮาร์ดลิงก์ "X" นั้นไม่ได้เชื่อมโยงกับ "Y" "X" และ "Y" เป็นไฟล์เดียวกัน
จอร์แดน

6
"ไฟล์ปกติ" ทั้งหมดในไดเรกทอรีเป็นการเชื่อมโยงอย่างหนัก ไฟล์ดังกล่าวบางไฟล์มีมากกว่าหนึ่งไฟล์
Andrew Henle

@ AndrewHenle ว้าวจุดดี นั่นคือสิ่งที่ฉันกำลังมองหาดังนั้นขอบคุณ
Mr. Minty Fresh

2
@ Mr.MintyFresh โดยเฉพาะไม่มีความแตกต่างระหว่าง "ต้นฉบับ" และ "ลิงก์" เนื่องจากมีไว้สำหรับลิงก์สัญลักษณ์
Random832

คำตอบ:


38

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

ชื่อไฟล์เป็นเพียงลิงค์ไปยัง inode นี้และเรียกว่า "ฮาร์ดลิงก์" ไม่มีความแตกต่างระหว่างชื่อไฟล์และลิงก์ที่ตามมา ดังนั้นคำตอบคือ "ใช่": ฮาร์ดลิงก์เป็นไฟล์ปกติและแน่นอนไฟล์ปกติคือฮาร์ดลิงก์

lsคำสั่งจะแสดงวิธีการเชื่อมโยงหลายยากที่มีไปยังแฟ้ม

ตัวอย่างเช่น:

seumasmac@comp:~$ echo Hello > /tmp/hello.txt
seumasmac@comp:~$ ls -l /tmp/hello.txt 
-rw-rw-r-- 1 seumasmac seumasmac 6 Oct  4 13:05 /tmp/hello.txt

/tmp/hello.txtที่นี่เราได้สร้างไฟล์ที่เรียกว่า 1ในการส่งออกจากls -lแสดงว่ามี 1 ลิงค์ยากที่จะไฟล์นี้ /tmp/hello.txtนี้การเชื่อมโยงที่ยากคือชื่อไฟล์ของตัวเอง

หากตอนนี้เราสร้างฮาร์ดลิงก์ไปยังไฟล์นี้:

seumasmac@comp:~$ ln /tmp/hello.txt /tmp/helloagain.txt
seumasmac@comp:~$ ls -l /tmp/hello*
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct  4 13:05 /tmp/helloagain.txt
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct  4 13:05 /tmp/hello.txt

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

seumasmac@comp:~$ ls -i /tmp/hello*
5374043 /tmp/helloagain.txt  5374043 /tmp/hello.txt

มีความเข้าใจผิดทั่วไปว่าสิ่งนี้แตกต่างกันสำหรับไดเรกทอรี ผมเคยได้ยินคนบอกว่าจำนวนของการเชื่อมโยงกลับโดยlsไดเรกทอรีคือจำนวนของไดเรกทอรีย่อยรวมทั้ง.และ..ซึ่งเป็นที่ไม่ถูกต้อง หรืออย่างน้อยก็ในขณะที่มันจะทำให้คุณมีจำนวนที่ถูกต้องมันเป็นเหตุผลที่ผิด!

หากเราสร้างไดเรกทอรีและทำสิ่งที่ls -ldเราได้รับ:

seumasmac@comp:~$ mkdir /tmp/testdir
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 2 seumasmac seumasmac 4096 Oct  4 13:20 /tmp/testdir

แสดงให้เห็นว่ามี 2 ฮาร์ดลิงก์ไปยังไดเรกทอรีนี้ เหล่านี้คือ:

/tmp/testdir
/tmp/testdir/.

ทราบว่า/tmp/testdir/..เป็นไม่ได้/tmpเชื่อมโยงไปยังไดเรกทอรีนี้ก็เชื่อมโยงไปยัง และสิ่งนี้บอกคุณว่าทำไม "จำนวนไดเรกทอรีย่อย" จึงใช้งานได้ เมื่อเราสร้างไดเรกทอรีย่อยใหม่:

seumasmac@comp:~$ mkdir /tmp/testdir/dir2
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 3 seumasmac seumasmac 4096 Oct  4 13:24 /tmp/testdir

ตอนนี้คุณจะเห็นว่ามี 3 ฮาร์ดลิงก์ไปยัง/tmp/testdirไดเรกทอรี เหล่านี้คือ:

/tmp/testdir
/tmp/testdir/.
/tmp/testdir/dir2/..

ดังนั้นทุกไดเรกทอรีย่อยใหม่จะเพิ่มจำนวนการเชื่อมโยงโดยหนึ่งเพราะ..รายการที่มี


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

ไม่เป็นไรฉันแน่ใจว่ามันจะเป็นข้อมูลที่มีประโยชน์สำหรับคนอื่น
seumasmac

การแก้ไขที่น่าสนใจด้วยระบบจุดเชื่อมโยงของ dotglob ฉันไม่เคยรู้เลยว่ามันทำเช่นนี้
Mr. Minty Fresh

ฉันชี้แจงลิงก์ยาก == วรรคไฟล์ปกติ
seumasmac

1
โดยเฉพาะอย่างยิ่งชอบประโยค: "ทั้งสองอย่างนี้ไม่ได้เป็นชื่อไฟล์ 'ที่เหมาะสม' พวกเขาทั้งคู่มีเหตุผลเท่าเทียมกัน" นั่นเป็นส่วนประกอบที่สำคัญในการทำความเข้าใจการเชื่อมโยงอย่างหนัก เขียนอย่างดีมาก
Wildcard

4

ฮาร์ดลิงก์นับเป็นไฟล์ปกติหรือไม่

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

mkdir test
cd !$

>file
ln -s file sym
mknod pipe p

ln file file2
ln -P sym sym2
ln pipe pipe2

ls -al

# sockets, too:
cat >tsock.c <<\EOD
#include <sys/socket.h>
#include <sys/un.h>
int main(int n, char **a)
{
        struct sockaddr_un test = { AF_UNIX, "socket" };
        int testfd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
        bind(testfd,(struct sockaddr *)&test,sizeof test);
}
EOD
make tsock
./tsock

ln socket socket2

ls -al

# even devices if you want:
sudo mknod mytty c 5 0
ln mytty mytty2
sudo chmod 666 mytty

ls -al
# notice permissions are on an object not on the links to it:
echo Hi, Kilroy! >mytty2  

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

ระบบจะบังคับใช้กฎในลิงก์ไดเรกทอรีคุณจะได้ลิงค์หนึ่งชื่อไปยังไดเรกทอรีและระบบจะเพิ่ม.ลิงค์ฝังตัวและลิงก์ย่อยของไดเรกทอรีใด ๆโดยอัตโนมัติ..(สังเกตว่า.ใน ls ข้างต้นมีสองลิงก์) แต่เป็นการตรวจสอบที่ชัดเจนในบาง modded ผู้ใช้ที่ได้รับสิทธิพิเศษซึ่งสัญญาว่าจะไม่ทำลูปสามารถเพิ่มลิงค์ใหม่ได้ด้วยตนเอง ระบบไฟล์ไม่สนใจมันสามารถแสดงกราฟไดเรกตอรีโดยพลการได้ดี แต่ไม่มีใครต้องการจัดการกับพวกมัน

มีระบบไฟล์ (ที่ไม่ใช่ยูนิกซ์) จำนวนมากที่ไม่ทำงานด้วยวิธีนี้รวมถึงบางระบบที่เรียกว่าสิ่งที่พวกเขาเสนอให้เป็น "ฮาร์ดลิงก์" แทน OS X ทำให้มีค่าเทียบเท่ากับ HFS ​​+ (ซึ่งไม่ได้มีกำเนิด) หากฉันจำได้อย่างถูกต้องฉันไม่รู้ว่ามันรักษาความหมายไว้ที่นี่ได้อย่างไร


สิ่งที่ไม่./tsockทำจริงหรือไม่?
mikeserv

@mikeserv มันเป็นโปรแกรมสร้างซ็อกเก็ตด้านบนมันแค่หยดลิงก์ซ็อกเก็ตชื่อ "ซ็อกเก็ต" ในไดเรกทอรีปัจจุบัน
jthill

ตกลง แต่บางทีฉันควรทำให้ชัดเจนขึ้นเกี่ยวกับว่าฉันรู้เกี่ยวกับซ็อกเก็ตน้อยเพียงใด ฉันคิดว่าฉันเข้าใจลิงค์ดีพอและมันก็ทำให้ชื่อใหม่ซ็อกเก็ตเดียวกันใช่ไหม? ที่ไม่ได้มีความสำคัญเป็นพิเศษสำหรับซ็อกเก็ตหรืออะไรใช่มั้ย ขอโทษเกี่ยวกับความไม่รู้ของฉัน
mikeserv

1
@mikeserv ซ็อกเก็ตเป็นเอนทิตีรันไทม์อย่างหมดจด socket()สร้างซ็อกเก็ตจริงbind()ให้ชื่อเฉพาะconnect()เชื่อมต่อซ็อกเก็ตที่คุณทำกับซ็อกเก็ตที่มีชื่อ ชนิดที่แตกต่างกันของซ็อกเก็ใช้ชนิดที่แตกต่างกันของชื่อเช่นซ็อกเก็ตอินเทอร์เน็ตใช้ที่อยู่อินเทอร์เน็ต แต่พวกเขาทั้งหมดหุ้นสามัญ API (รวมถึงread()และwrite()มันทำให้ฉันเศร้าที่คุณไม่สามารถopen()ซ็อกเก็ตระบบแฟ้มและมีระบบปฏิบัติการหรือ libc ทำsocket()และconnect()สำหรับคุณ) . man 7 socketมีมากขึ้นทุกโปรโตคอลเครือข่ายจะทำเพื่อ manpage อยู่ไม่สุข
jthill

1
@mikeserv ดูฉันสามารถสะกด pty และ pts และอาจเป็น ptmx ในวันที่ดี แต่นั่นเป็นเรื่องของมัน :-) อย่างน้อย 5,0 โหนดทำงานได้ทุกที่ที่ฉันสามารถหาได้มันเป็นประเภทอุปกรณ์ควบคุม ฉันได้รับเพียง ls -l / dev / tty เดาว่าฉันโชคดีที่นั่น
jthill
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.