ใน 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
อ้างอิง