ทำไม 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 จะมีโอกาสทำงาน สิ่งนี้อาจนำไปสู่พฤติกรรมที่ไม่คาดคิด:

  1. การขยายไวลด์การ์ด

    • หากมีไฟล์ .sh อยู่ในไดเร็กทอรีปัจจุบันของคุณ เช่น tkConfig.sh การพิมพ์ find /usr -name *.sh จะขยายเป็น find /usr -name tkConfig.sh ซึ่งจำกัดการค้นหาของคุณไว้เพียงไฟล์นั้นเท่านั้น
  2. ข้อผิดพลาดทางไวยากรณ์

    • หากมีไฟล์หลายไฟล์ที่ตรงกับ ข้อความ 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 ด้วยความมั่นใจ! หากคุณมีคำถามหรือต้องการความช่วยเหลือเพิ่มเติม สามารถส่งความคิดเห็นของคุณไว้ด้านล่างได้เลย