ทำไม find
ถึงไม่คืนผลลัพธ์ตามที่คาดหวัง? นี่คือวิธีการแก้ไข
หากคุณเคยรันคำสั่ง find
ในระบบที่ใช้ Unix ของคุณ คุณอาจพบกับสถานการณ์ที่น่าผิดหวังที่คำสั่งไม่สามารถค้นหาไฟล์ที่คุณรู้ว่าอยู่ที่นั่นได้ ตัวอย่างเช่น คุณอาจต้องการค้นหาไฟล์สคริปต์เชลล์และถึงแม้ว่าคุณจะมั่นใจว่ามันมีอยู่ แต่ผลลัพธ์กลับว่างเปล่า ปัญหานี้เกิดจากความเข้าใจผิดเกี่ยวกับวิธีที่คำสั่ง find
แปลตัวอักขระแบบไวลด์การ์ด มาลงลึกในปัญหาและค้นพบวิธีการแก้ไขที่ช่วยให้การค้นหาของคุณกลับมาบนเส้นทางที่ถูกต้อง
ปัญหา: find
ไม่ทำงานตามที่คาดหวัง
พิจารณาคำสั่งนี้ที่คุณเคยลอง:
$ find /usr -name *.sh
คำสั่งนี้มีเป้าหมายเพื่อค้นหาไฟล์ทั้งหมดที่มีนามสกุล .sh
ในไดเรกทอรี /usr
อย่างไรก็ตาม หากคุณพบว่าไม่มีผลลัพธ์ปรากฏ อาจทำให้คุณสงสัยว่า ทำไม find
ถึงไม่ทำงาน?
คุณรู้ว่าสคริปต์นั้นมีอยู่; ตัวอย่างเช่น เมื่อคุณรัน:
$ ls /usr/local/lib/*.sh
คุณสามารถเห็นไฟล์เช่น tclConfig.sh
และ tkConfig.sh
แล้วทำไมคำสั่ง find
ของคุณถึงไม่ทำงาน?
เข้าใจปัญหา
ปัญหาหลักคือวิธีที่เชลล์คำสั่งแปลตัวอักขระแบบไวลด์การ์ด *.sh
โดยเฉพาะอย่างยิ่ง หากมีไฟล์ใดๆ ในไดเร็กทอรีปัจจุบันของคุณที่ตรงกับ *.sh
เชลล์จะทำการขยายตัวอักขระแบบไวลด์การ์ดนั้นก่อนที่ find
จะมีโอกาสทำงาน สิ่งนี้อาจนำไปสู่พฤติกรรมที่ไม่คาดคิด:
-
การขยายไวลด์การ์ด
- หากมีไฟล์
.sh
อยู่ในไดเร็กทอรีปัจจุบันของคุณ เช่นtkConfig.sh
การพิมพ์find /usr -name *.sh
จะขยายเป็นfind /usr -name tkConfig.sh
ซึ่งจำกัดการค้นหาของคุณไว้เพียงไฟล์นั้นเท่านั้น
- หากมีไฟล์
-
ข้อผิดพลาดทางไวยากรณ์
- หากมีไฟล์หลายไฟล์ที่ตรงกับ ข้อความ
find
อาจเกิดข้อผิดพลาดทางไวยากรณ์จากการใช้พารามิเตอร์ที่ไม่ชัดเจน:find: bad option tkConfig.sh
- หากมีไฟล์หลายไฟล์ที่ตรงกับ ข้อความ
วิธีแก้ไขที่ 1: การใส่เครื่องหมายคำพูดไว้รอบตัวไวลด์การ์ด
เพื่อป้องกันไม่ให้เชลล์ขยายตัวอักขระแบบไวลด์การ์ดก่อนที่จะส่งต่อไปยัง find
คุณสามารถใส่เครื่องหมายคำพูดรอบตัวไวลด์การ์ด:
- ใช้เครื่องหมายคำพูดคู่:
$ find /usr -name "*.sh"
- หรือใช้เครื่องหมายคำพูดเดี่ยว:
$ find /usr -name '*.sh'
โดยการใส่เครื่องหมายคำพูดรอบ *.sh
คุณจะสั่งให้เชลล์ส่งต่อไปยัง find
ได้อย่างไม่เปลี่ยนแปลง ซึ่งทำให้มันสามารถค้นหาทุกไฟล์ .sh
ในไดเรกทอรีที่ระบุได้
วิธีแก้ไขที่ 2: ติดตามลิงก์สัญลักษณ์
อีกสาเหตุหนึ่งที่ทำให้ find
อาจไม่ทำงานตามที่คาดหวังคือการมีลิงก์สัญลักษณ์ในไดเรกทอรี /usr
หรือในไดเรกทอรีย่อย โดยค่าเริ่มต้น find
จะไม่ติดตามลิงก์สัญลักษณ์ หากคุณสงสัยว่านี่จะเป็นสาเหตุ คุณสามารถใช้ตัวเลือก -follow
:
$ find /usr -follow -name '*.sh'
คำสั่งนี้จะอนุญาตให้ find
เคลื่อนที่ไปตามลิงก์สัญลักษณ์และค้นหาไฟล์ที่ต้องการ
สรุป
โดยสรุป หากคุณพบว่าคำสั่ง find
ไม่ได้ผลลัพธ์ตามที่คาดหวังเมื่อค้นหาสคริปต์เชลล์ มีแนวโน้มว่าจะเป็นเพราะการขยายไวลด์การ์ดหรือการมีลิงก์สัญลักษณ์ อย่าลืมใส่เครื่องหมายคำพูดรอบตัวไวลด์การ์ดเพื่อป้องกันการขยายล่วงหน้า และหากจำเป็น ให้ใช้ตัวเลือก -follow
ด้วยการนำกลยุทธ์เหล่านี้ไปใช้ คุณจะสามารถค้นหาสคริปต์เชลล์ของคุณได้สำเร็จและเพิ่มทักษะการทำงานกับบรรทัดคำสั่งของคุณ!
ขอให้โชคดีในการค้นหา!
ตอนนี้คุณพร้อมที่จะจัดการกับคำสั่ง find
ด้วยความมั่นใจ! หากคุณมีคำถามหรือต้องการความช่วยเหลือเพิ่มเติม สามารถส่งความคิดเห็นของคุณไว้ด้านล่างได้เลย