การอภิปรายล่าสุดเกี่ยวกับการค้นหาไฟล์ในระบบคล้าย Unix ได้จุดประกายให้เกิดการถกเถียงอย่างคึกคักในชุมชนเทคโนโลยี โดยเน้นทั้งวิธีการแบบดั้งเดิมและทางเลือกสมัยใหม่สำหรับคำสั่ง find
อันเป็นที่รู้จัก สิ่งที่เริ่มต้นจากบทความการแก้ไขปัญหาเกี่ยวกับพฤติกรรมที่ไม่คาดคิดของ find -print0
ได้พัฒนาไปสู่การสนทนาที่กว้างขึ้นเกี่ยวกับเครื่องมือคำสั่งและแนวทางปฏิบัติที่ดีที่สุด
ทำความเข้าใจ -print0 และความเข้าใจผิดทั่วไป
ชุมชนได้ชี้ให้เห็นว่าปัญหาพื้นฐานมาจากความเข้าใจผิดเกี่ยวกับการทำงานของ -print0
แทนที่จะเป็นพฤติกรรมที่น่าสงสัย ตัวคั่นอักขระ null เป็นฟีเจอร์ที่ถูกออกแบบมาโดยเฉพาะเพื่อจัดการกับชื่อไฟล์ที่มีอักขระพิเศษ โดยเฉพาะการขึ้นบรรทัดใหม่ นักพัฒนาหลายคนสังเกตว่าการใช้ -print0
โดยไม่จำเป็นอาจทำให้งานค้นหาไฟล์ง่ายๆ ซับซ้อนขึ้น ในขณะที่การใช้ -print
แบบมาตรฐานก็เพียงพอแล้ว
หากคุณรันคำสั่งนี้แบบโต้ตอบกับไฟล์ของคุณเอง การพูดว่าใครจะทำแบบนั้นก็คงไม่เป็นไร แต่ถ้าโค้ดเซิร์ฟเวอร์ของคุณรันคำสั่งนี้กับข้อมูลที่ไม่น่าเชื่อถือ (เช่น ไฟล์ที่ผู้ใช้อัปโหลด) คำตอบก็คือ: คนที่พยายามจะแฮ็กระบบของคุณ
ทางเลือกสมัยใหม่แทนการใช้ find แบบดั้งเดิม
การอภิปรายได้เผยให้เห็นทางเลือกสมัยใหม่หลายอย่างที่นักพัฒนากำลังนำมาใช้มากขึ้น เครื่องมือเช่น fd
, ripgrep
และรูปแบบการใช้ find
ที่ตรงไปตรงมามากขึ้นด้วย -exec +
กำลังได้รับความนิยม ทางเลือกเหล่านี้มักให้ไวยากรณ์ที่เข้าใจง่ายกว่าและประสิทธิภาพที่ดีกว่าสำหรับการใช้งานทั่วไป ชุมชนเน้นย้ำถึง ripgrep
เป็นพิเศษสำหรับความเร็วและไวยากรณ์ regex ที่ทันสมัยกว่า แม้ว่าผู้ใช้บางคนจะสังเกตว่ามีรูปแบบพฤติกรรมที่แตกต่างกันที่ต้องทำความเข้าใจ
แนวทางปฏิบัติที่ดีที่สุดและวิธีแก้ปัญหาที่ง่ายกว่า
ผู้ใช้ที่มีประสบการณ์ได้แนะนำวิธีการที่ง่ายกว่าหลายวิธีสำหรับงานค้นหาไฟล์ แทนที่จะใช้ท่อ (pipes) ที่ซับซ้อนและการรวมกับ xargs
หลายคนแนะนำให้ใช้ฟีเจอร์ในตัวของ find เช่น -iname
สำหรับการจับคู่ชื่อไฟล์แบบไม่คำนึงถึงตัวพิมพ์ใหญ่-เล็ก หรือ -exec
สำหรับการค้นหาเนื้อหา สำหรับการจับคู่รูปแบบชื่อไฟล์พื้นฐาน ผู้ใช้บางคนแนะนำให้ใช้ฟีเจอร์ globstar ของ bash (**
) เป็นทางเลือกที่ง่ายกว่า
เครื่องมือและคำสั่งทางเลือก:
- fd: เครื่องมือทันสมัยที่ใช้แทน find
- ripgrep: เครื่องมือค้นหาที่ทำงานเร็วพร้อมรองรับ regex แบบสมัยใหม่
- find -exec +: เป็นตัวเลือกที่นิยมใช้มากกว่า xargs ในหลายกรณี
- locate: ทางเลือกทั่วไปสำหรับการค้นหาชื่อไฟล์แบบง่าย
วิธีแก้ปัญหาทั่วไปสำหรับการค้นหาไฟล์:
- การค้นหาชื่อไฟล์พื้นฐาน:
find -name '*.py'
- การค้นหาแบบไม่คำนึงถึงตัวพิมพ์ใหญ่-เล็ก:
find -iname '*pattern*'
- การค้นหาเนื้อหา:
grep -r --include '*.py' -l -i pattern .
- ทางเลือกแบบ globstar:
grep pattern **/*py
ข้อพิจารณาด้านความปลอดภัย
ประเด็นสำคัญที่เกิดขึ้นจากการอภิปรายคือผลกระทบด้านความปลอดภัยของวิธีการค้นหาไฟล์แบบต่างๆ ในขณะที่วิธีแก้ปัญหาแบบง่ายๆ อาจใช้ได้สำหรับการใช้งานส่วนตัว การจัดการกับข้อมูลที่ไม่น่าเชื่อถือหรือการดำเนินการระดับระบบต้องการวิธีการที่แข็งแกร่งกว่าซึ่งสามารถจัดการกับอักขระพิเศษในชื่อไฟล์ได้อย่างเหมาะสม
การถกเถียงนี้ชี้ให้เห็นประเด็นที่กว้างขึ้นเกี่ยวกับเครื่องมือคำสั่ง: แม้ว่าจะมีหลายวิธีในการทำงานเดียวกัน แต่การเข้าใจกลไกพื้นฐานเป็นสิ่งสำคัญในการเลือกเครื่องมือที่เหมาะสมสำหรับการใช้งานแต่ละกรณี
แหล่งอ้างอิง: Resolving a mysterious problem with find