วิธีค้นหาและลบ Symlink ที่ใช้งานไม่ได้บน Linux

เผยแพร่แล้ว: 2022-01-29
หน้าต่างเทอร์มินัลบนแล็ปท็อป Linux
Fatmawati Achmad Zaenuri/Shutterstock

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

ลิงค์สัญลักษณ์101

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

ตัวอย่างเช่น สมมติว่าคุณมีลิงก์สัญลักษณ์ในโฮมไดเร็กทอรีชื่อ "dave-link" ซึ่งชี้ไปยังไฟล์ชื่อ "text-file.txt" ซึ่งอยู่ที่อื่นในแผนผังระบบไฟล์ คำสั่งที่คุณใช้บน symlink จะถูกนำไปใช้กับไฟล์ที่มันชี้ไปโดยอัตโนมัติ หากคุณพยายามใช้ cat หรือ less บน symlink คุณจะเห็นเนื้อหาของไฟล์ “text-file.txt”

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

เราสามารถเห็นการเชื่อมโยงบางอย่างได้อย่างง่ายดายโดยใช้ ls ในไดเรกทอรีราก รายการบางรายการจะแสดงเป็นสีอื่น—ในเครื่องทดสอบ Ubuntu 20.10 ของเราจะแสดงเป็นสีน้ำเงินอ่อน

เราพิมพ์ดังต่อไปนี้:

 ลส / 

โฆษณา

เราสามารถเจาะลึกลงไปได้โดยใช้ตัวเลือก -l (รายการแบบยาว) เราพิมพ์คำสั่งต่อไปนี้เพื่อดูรายการ "lib" ทั้งหมดและรายการ "bin" เดียว:

 ls -l /lib* /bin 

ที่จุดเริ่มต้นของแต่ละบรรทัดจะมี "l" ซึ่งระบุว่ารายการนั้นเป็นลิงก์สัญลักษณ์ ข้อความที่อยู่หลัง “->” แสดงว่าลิงก์สัญลักษณ์กำลังชี้ไปที่อะไร ในตัวอย่างของเรา เป้าหมายคือไดเร็กทอรีทั้งหมด

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

Symlinks เสีย

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

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

เราสามารถเห็นพฤติกรรมนี้ได้อย่างง่ายดายโดยใช้ symlink ที่เรียกว่า “hello” ในไดเร็กทอรีปัจจุบัน เราพิมพ์ข้อความต่อไปนี้โดยใช้ ls เพื่อดู:

 ลส -ล
โฆษณา

มันชี้ไปที่โปรแกรมที่เรียกว่า "htg" ในไดเร็กทอรีชื่อ "bin" ถ้าเรา "เรียกใช้" symlink โปรแกรมจะรันโปรแกรมให้เรา:

 ./สวัสดี

ขณะนี้เราสามารถตรวจสอบว่านี่คือสิ่งที่เกิดขึ้นหรือไม่โดยการเรียกใช้โปรแกรมโดยตรง:

 ../bin/htg

ตามที่คาดไว้ เราได้รับคำตอบแบบเดียวกัน มาลบไฟล์โปรแกรมกัน:

 rm ../bin/htg

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

โปรดทราบว่าหากเราพยายามเรียกใช้ symlink ข้อผิดพลาดที่เราได้รับจะอ้างอิงถึงชื่อ symlink แทนที่จะเป็นชื่อของโปรแกรมที่ symlink ชี้ไป

เราพิมพ์ดังต่อไปนี้:

 ./สวัสดี 

ค้นหา Symlink ที่เสีย

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

 หา . -xtype l 

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

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

หากเราไพพ์เอาต์พุตผ่าน wc ด้วยตัวเลือก -l (lines) เราสามารถนับเส้นได้ ซึ่งเหมือนกับการนับ symlink ที่เสีย

เราพิมพ์ดังต่อไปนี้:

 หา . -xtype l | wc -l 

เราได้รับแจ้งว่าเรามี 24 ลิงก์เสียที่ชี้ไปที่ไม่มีอะไร

ค้นหา ตรวจสอบ แล้วลบ

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

บางครั้ง symlink อาจเป็นปัญหา ไม่ใช่ไฟล์เป้าหมาย หาก symlink ถูกสร้างขึ้นอย่างไม่ถูกต้อง มันอาจจะชี้ไปที่ไม่มีอะไร แต่มีเป้าหมายที่แท้จริงอยู่ การสร้าง symlink ใหม่จะเป็นการแก้ไขในกรณีนั้น

นอกจากนี้ยังเป็นไปได้ว่ามีการใช้ symlink ที่เสียหายอย่างเห็นได้ชัดเป็นอย่างอื่น เช่น ตัวบ่งชี้การล็อกไฟล์หรือตัวบ่งชี้ go/no go อื่นๆ Firefox ทำเช่นนี้; นั่นคือสิ่งที่ symlink แรกในรายการของเราคือ Firefox ไม่ได้ใช้ในเครื่องทดสอบของเรา ดังนั้นจึงปลอดภัยสำหรับเราที่จะลบออก

โฆษณา

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

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

เมื่อคุณแก้ไขลิงก์ที่ใช้งานไม่ได้แล้ว ให้ทำซ้ำคำสั่งเพื่อทำการค้นหา ลิงก์สัญลักษณ์คงที่จะหายไปจากผลการค้นหา

เพื่อความปลอดภัย เป็นการดีที่สุดที่จะจำกัดการลบ symlink ของคุณไว้ที่ไดเร็กทอรีของคุณเอง โปรดใช้ความระมัดระวังอย่างยิ่งในการรันคำสั่งเหล่านี้ในฐานะรูทหรือบนไดเร็กทอรีของระบบ

การลบ Symlinks ที่ใช้งานไม่ได้

ตัวเลือก -exec (ดำเนินการ) จะรันคำสั่งในผลการ find เราจะใช้ rm เพื่อลบ symlink ที่เสียแต่ละอัน สตริง {} จะถูกแทนที่ด้วยชื่อของแต่ละลิงก์ที่เสีย เนื่องจากแต่ละอันถูกค้นพบโดย find

เราต้องใช้เครื่องหมายอัฒภาค ( ; ) เพื่อยุติรายการคำสั่งที่เราต้องการให้ -exec ทำงาน เราจะใช้แบ็กสแลช ( \ ) เพื่อ "หนี" อัฒภาค ดังนั้นจึงถือว่าเป็นส่วนหนึ่งของคำสั่ง find แทนที่จะเป็นสิ่งที่ Bash ควรทำ

เราพิมพ์ดังต่อไปนี้:

 หา . -xtype l -exec rm {} \; 

โฆษณา

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

 หา . -xtype l 

ไม่มีผลลัพธ์ที่ตรงกัน ซึ่งหมายความว่า symlink ที่ใช้งานไม่ได้ถูกลบแล้ว

อย่าลืมทบทวนก่อน

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

ตัวอย่างเช่น ข้างต้น เราสามารถเรียกใช้คำสั่งในไดเร็กทอรี ".snap" จากนั้นจึงลบ symlink "hello" ที่โดดเดี่ยวออกด้วยตนเอง สิ่งนี้จะทำให้ลิงก์ล็อคของ Firefox ไม่ถูกแตะต้อง