คำตอบ:
glob ที่ไม่มีเครื่องหมายจะถูกขยายโดยเชลล์ก่อนที่จะfindถูกเรียกใช้งาน (อ้างอิงถึงการขยายชื่อไฟล์ในคู่มือ)
ดังนั้นพูดว่า:
find . -name *.pyc -delete
จะดำเนินการจริง:
find . -name file1.pyc file2.pyc file3.pyc -delete
สมมติว่ามีไฟล์ 3 ไฟล์. pyc ในไดเรกทอรีปัจจุบันและทำให้เกิดข้อผิดพลาดแทน
แบ็กสแลชทำให้เชลล์ส่งผ่าน glob ไปยังfindนั่นคือทำหน้าที่เหมือน*.pycถูกยกมา
เป็นการดีที่คุณควรจะอ้างอิงวงกว้าง:
find . -name '*.pyc' -delete
ก่อนที่เปลือกของคุณประเด็นfindคำสั่งก็จะทำต่างๆขยาย การทำเช่นนั้นมันยังประมวลผลอักขระพิเศษ (หรือตัวละครที่มีความหมายพิเศษ) ซึ่ง*เป็นสัญลักษณ์แทน - ตัวอักษรกลม นี่คือการขยายชื่อไฟล์ที่เรียกว่า
สมมติว่าคุณมีสองไฟล์ในไดเรกทอรีของคุณ:
foo.pycbar.pycจากนั้น*.pycจะขยายเป็นชื่อทั้งสอง ดังนั้นถ้าคุณเขียน:
find . -name *.pyc -delete
จากนั้นเชลล์จะเรียกจริง:
find . -name foo.pyc bar.pyc -delete
ซึ่งไม่สมเหตุสมผลนักเนื่องจากคุณสามารถมีข้อโต้แย้งเพียงข้อเดียว-nameเท่านั้น นั่นเป็นเหตุผลที่คุณต้องหลบหนีอักขระพิเศษเพื่อป้องกันไม่ให้ถูกตีความโดยเชลล์ คุณทำเช่นนั้นโดยการใช้เครื่องหมายแบคสแลชหรือหลีกเลี่ยงการอ้างถึง
findควรมีส่วนที่เรียกNON-BUGSพร้อมกับสิ่งที่คล้ายกันเป็นตัวอย่างและคำอธิบายว่าทำไมจึงมีความจำเป็น