φυβλαςのβλογ
บล็อกของ phyblas



การใช้คำสั่ง ln สร้างลิงก์เชื่อมโยงไฟล์ใน linux
เขียนเมื่อ 2020/03/03 23:41
แก้ไขล่าสุด 2020/03/19 14:05
ใน 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

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

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
python
-- numpy
-- matplotlib

-- pandas
-- pytorch
maya
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
javascript
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
เรียนภาษาจีน
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



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

  ค้นหาบทความ

  บทความแนะนำ

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

บทความแต่ละเดือน

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2019年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2018年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2017年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2016年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文