φυβλαςのβλογ
phyblas的博客



การใช้คำสั่ง ln สร้างลิงก์เชื่อมโยงไฟล์ใน linux
เขียนเมื่อ 2020/03/03 23:41
แก้ไขล่าสุด 2021/09/28 16:42
ใน linux (หรือ mac) เวลาที่ต้องการให้ไฟล​์หรือโฟลเดอร์บางตัวสามารถเข้าถึงได้จาก ๒ ที่ได้ในลักษณะเดียวกัน อาจทำได้โดยการสร้างลิงก์ (link) เชื่อมโยง

หากเทียบกับวินโดวส์แล้วก็คือเทียบได้กับการสร้าง ชอร์ตคัต (short cut) คือไฟล์ที่ใช้เป็นตัวแทนเพื่อเข้าถึงอีกไฟล์

แต่ลิงก์ใน linux นั้นมีอยู่ ๒ ชนิด คือ

- ฮาร์ดลิงก์ (hard link)
เป็นการสร้างช่องทางให้เข้าถึงไฟล์ได้อีกทาง โดยทั้งตัวที่สร้างใหม่ กับตัวไฟล์เดิมจะถือเป็นไฟล์เดียวกัน

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

วิธีการสร้างลิงก์ทั้ง ๒​ แบบทำได้โดยใช้คำสั่ง ln โดยใส่ชื่อไฟล์ต้นทาง ตามด้วยชื่อของลิงก์ที่ต้องการสร้าง

ข้อแตกต่างคือถ้าจะสร้างซิมโบลิกลิงก์ให้เติม -s เข้าไปในคำสั่งด้วย แต่ถ้าเป็นฮาร์ดลิงก์จะไม่ต้องเติม

เพื่อให้เข้าใจวิธีการสร้างและความแตกต่างของลิงก์ทั้ง ๒ แบบขอยกตัวอย่าง

สมมุติว่ามีไฟล์อยู่ไฟล์หนึ่ง ชื่อ aku.txt
ls -lh

ได้
-rw-r--r-- 2 phyblas phyblas 1.2K มี.ค. 3 21:36 aku.txt

จากนั้นลองสร้างลิงก์ทั้ง ๒ แบบขึ้นมา
ln aku.txt haku.txt
ln -s aku.txt saku.txt

ในที่นี้ saku.txt ใช้ ln -s จึงได้เป็นซิมโบลิกลิงก์ ส่วน haku.txt พิมพ์ ln เฉยๆไม่ได้ใส่ -s จึงเป็นฮาร์ดลิงก์

จากนั้นไม่ว่าจะเปิดที่ตัวไฟล์ haku.txt หรือ saku.txt ก็จะได้ผลเหมือนกัน คือเท่ากับเป็นการเปิดตัวไฟล์ aku.txt ขึ้นมา

แต่หากลองดูรายละเอียดข้อมูลของไฟล์แต่ละตัวที่ได้มาก็จะได้ต่างกัน
ls -lh

ได้
-rw-r--r-- 2 phyblas phyblas 1.2K มี.ค. 3 21:36 aku.txt
-rw-r--r-- 2 phyblas phyblas 1.2K มี.ค. 3 21:36 haku.txt
lrwxrwxrwx 1 phyblas phyblas 7 มี.ค. 3 21:39 saku.txt -> aku.txt

จะเห็นว่า haku.txt ซึ่งถูกสร้างเป็นฮาร์ดลิงก์นั้นจะออกมาเป็นไฟล์ที่เหมือนกับ aku.txt ที่เป็นต้นแบบทุกอย่าง เช่นขนาดไฟล์เป็น 1.2K เท่ากัน อัปเดตล่าสุดเป็น 3 มี.ค. 21:36 เหมือนกัน

ส่วน saku.txt ซึ่งเป็นซิมโบลิกลิงก์นั้นจะเกิดเป็นไฟล์ใหม่ขึ้นมาเลย ซึ่งไฟล์นี้จะลิงก์โยงไปยังตัว aku.txt โดยจะเห็นว่าตัวไฟล์ saku.txt เองมีขนาดแค่ 7 ไบต์ เท่านั้น ซึ่งที่มีขนาดเท่านี้ก็เพราะว่าแทนชื่อ aku.txt ซึ่งมีอักษรทั้งหมด ๗ ตัว นั่นคือซิมโบลิกลิงก์แค่เก็บชื่อของปลายทางที่จะลิงก์ไปเท่านั้น

นอกจากนี้ เมื่อใช้ ls เพื่อดูข้อมูล ถ้าใส่ -i ไปจะมีการแสดงหมายเลข inode ของไฟล์ ซึ่งเป็นเลขที่ชี้ถึงตำแหน่งที่เก็บไฟล์ เลขนี้จะจำเพาะต่างกันไปในแต่ละไฟล์ แต่สำหรับไฟล์ที่เป็นฮาร์ดลิงก์จะได้ออกมาเป็นเลขเดียวกัน นั่นเพราะมันชี้ไปยังไฟล์เดียวกัน
ls -i

ได้
2884903 aku.txt 2884903 haku.txt 2884902 saku.txt

เลขที่อยู่ด้านหน้าชื่อไฟล์ในที่นี้ก็คือเลข inode จะเห็นว่า saku.txt ซึ่งเป็นซิมโบลิกลิงก์เท่านั้นที่มีเลขต่างไป

จากนั้นมาดูกันว่าหากลบไฟล์ต้นฉบับทิ้งจะเกิดอะไรขึ้น เช่นลองลบ aku.txt ออกไปดู แล้วดูว่าจะเกิดอะไรกับไฟล์ที่เป็นลิงก์
rm aku.txt
ls

จะเห็นว่าลบ aku.txt ไปแล้ว ไม่มีแล้ว แต่ทั้งไฟล์ haku.txt และ saku.txt ยังคงอยู่
haku.txt saku.txt

แต่เมื่อลองเปิดไฟล์จากซิมโบลิกลิงก์ดู
cat saku.txt

จะขึ้นมาว่าไม่พบว่ามีไฟล์นี้อยู่
cat: saku.txt: No such file or directory

นั่นเพราะซิมโบลิกลิงก์ saku.txt แค่เป็นไฟล์ที่จะโยงไปยัง aku.txt ซึ่งเป็นไฟล์ต้นทาง แต่เนื่องจากไฟล์ต้นทางถูกลบทิ้งไปแล้ว แม้ตัวซิมโบลิกลิงก์จะไม่ได้หายไปด้วย แต่ก็ไม่มีปลายทาง

แต่ถ้าลองเปิดตัวที่เป็นฮาร์ดลิงก์ จะพบว่าเปิดได้ตามปกติ แม้ไฟล์เดิมจะลบไปแล้ว
cat haku.txt

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

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



เมื่อใช้คำสั่ง ln สร้างฮาร์ดลิงก์ ถ้าหากชื่อตัวต้นฉบับที่ใส่ไปนั้นไม่มีตัวตนอยู่จะไม่สามารถสร้างได้

เช่นลอง
ln aka.txt haka.txt

ได้
ln: failed to access 'aka.txt': No such file or directory

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

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

เช่น
ln -s aka.txt saka.txt

แบบนี้เป็นการสร้างซิมโบลิกลิงก์ saka.txt เพื่อโยงไปยังไฟล์ชื่อ aka.txt ซึ่งจะสร้างได้โดยไม่เกิดข้อผิดพลาดใดๆ แต่ในเมื่อไฟล์ aka.txt นี้ไม่มีตัวตนอยู่จริง ดังนั้นถ้าสั่งเปิด saka.txt ก็จะขึ้นว่าไม่พบไฟล์

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

สมมุติว่าลองสร้างซิมโบลิกลิงก์ shaku.txt ขึ้นมา ให้โยงไปที่ haku.txt โดยใส่พาธเป็นแบบสัมพัทธ์
ln -s haku.txt shaku.txt

ตอนที่สร้างขึ้นมานั้นไฟล์ก็ถูกโยงไปตามปกติ แต่ว่าถ้าหากซิมโบลิกลิงก์ถูกย้ายไปอยู่ที่อื่น ก็จะใช้ไม่ได้ทันที เช่น
mkdir kai
mv shaku.txt kai
cat kai/shaku.txt

ได้
cat: kai/shaku.txt: No such file or directory

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

ในทางกลับกัน ถ้าไปสร้างซิมโบลิกลิงก์ในโฟลเดอร์อื่น เช่นลองใส่ไว้ในโฟลเดอร์ด้านใน แล้วใช้พาธสัมพัทธ์เป็น ../ เพื่อให้ชี้ไฟล์ข้างนอกนี้ก็ได้ แบบนี้ก็จะใช้การได้เช่นกัน
ln -s ../haku.txt kai/sha.txt
cat kai/sha.txt

แบบนี้ไฟล์ sha.txt ในโฟลเดอร์ kai ก็จะเชื่อมโยงไปยัง haku.txt

แต่เราสามารถสร้างโดยเขียนเป็นแบบพาธสัมบูรณ์ คือใส่พาธตั้งแต่รากฐานโดยตรง เช่น
ln -s /home/phyblas/mirai/haku.txt shaku.txt

แบบนี้ไม่ว่าตัวซิมโบลิกลิงก์จะถูกย้ายไปไหนก็จะยังคงโยงไปที่เดิม



กรณีที่ไฟล์เดิมมีอยู่แล้ว

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

เช่น
ln -s haku.txt shaku.txt

ได้
ln: failed to create symbolic link 'shaku.txt': File exists

แต่หากต้องการให้เขียนทับไฟล์เดิมไปเลยโดยไม่ต้องสนแม้จะมีอยู่แล้ว ก็เติม -f
ln -s -f haku.txt shaku.txt

แบบนี้ซิมโบลิกลิงก์ที่สร้างขึ้นใหม่ก็จะไปทับของเก่า

หรือถ้าใช้ -i ก็จะเกิดการถามยืนยันว่าจะทับหรือไม่ในกรณีที่มีชื่อซ้ำ แต่ถ้าไม่ซ้ำก็ไม่เกิดอะไรขึ้น
ln -s -i haku.txt shaku.txt

จะขึ้นมาว่า
ln: replace 'shaku.txt'?

ถ้าตอบ y จึงจะเขียนทับลงไป

นอกจากนี้ถ้าใส่ -b เมื่อชื่อซ้ำไฟล์เก่าจะถูกนำไปสำรองในอีกชื่อโดยมี ~ ต่อท้าย

ln -s -b haku.txt shaku.txt
ls -l

ได้
sh-rw-r--r-- 1 phyblas phyblas 1182 มี.ค. 3 21:36 haku.txt
drwxr-xr-x 2 phyblas phyblas 4096 มี.ค. 3 23:28 kai
lrwxrwxrwx 1 phyblas phyblas 8 มี.ค. 3 23:59 shaku.txt -> haku.txt
lrwxrwxrwx 1 phyblas phyblas 8 มี.ค. 3 23:56 shaku.txt~ -> haku.txt



อ้างอิง


-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> shell

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

目录

从日本来的名言
模块
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
机器学习
-- 神经网络
javascript
蒙古语
语言学
maya
概率论
与日本相关的日记
与中国相关的日记
-- 与北京相关的日记
-- 与香港相关的日记
-- 与澳门相关的日记
与台湾相关的日记
与北欧相关的日记
与其他国家相关的日记
qiita
其他日志

按类别分日志



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  查看日志

  推荐日志

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ