ระวังให้ดีว่าคุณกำลังใช้คำว่า "regular expression" ค่อนข้างหลวม .. สิ่งที่คุณกำลังทำอยู่ในfind
-name
ตัวเลือกนั้นค่อนข้างใกล้เคียงกับพฤติกรรมของshell
glob
... ในทางกลับกันfind
-regex
ตัวเลือกนี้ใช้การค้นหาแบบ expression ปกติ คุณสามารถเลือกรูปแบบของ regex ที่จะใช้ผ่านตัวเลือก -regextyp .. ตัวเลือกประเภทที่ใช้ในปัจจุบันคือ: emacs (นี่คือค่าเริ่มต้น), posix-awk, posix-basic, posix-egrep และ posix-Extended ...
วิธีจัดการกับแบ็กสแลชและดอกจัน ฯลฯ อาจแตกต่างกันไปขึ้นอยู่กับสิ่งที่คุณต้องการจะทำ หากคุณต้องการfind -name
ที่จะต้องพิจารณาก็ดอกจันเป็นอักขระตัวแทนแล้วคุณจะต้องให้แน่ใจว่าจะไม่หลบหนีเมื่อfind
จริงอ่านรูปแบบจากบรรทัดคำสั่ง
เพื่อให้แน่ใจว่าการ ค้นหาได้มาในรูปแบบที่ไม่ใช้ค่า Escape คุณต้องป้องกันเชลล์ (โดยทั่วไปคือทุบตี ) จากการทำงานของการขยายตัวของเชลล์ * (มีประสิทธิภาพมาก) บนเครื่องหมายดอกจันของคุณ ... เพื่อปกป้องมันคุณต้อง หนีออกจากระดับบรรทัดคำสั่ง เช่น. "หลบหนี" ในสายตาของกระสุน) .. แนวคิดหลัก ณ จุดนี้คือ"ป้องกัน" ...
คุณสามารถป้องกันเครื่องหมายดอกจันจากเชลล์ได้สามวิธี:
- ใช้
'
เครื่องหมายคำพูดเดี่ยว'
- ใช้
"
เครื่องหมายคำพูดคู่"
- ใช้
\
แบ็กสแลช (และไม่มีเครื่องหมายคำพูด)
ดังนั้นfind
เพื่อดูว่าเครื่องหมายดอกจันของคุณเป็นไวลด์การ์ดวิธีการ "ป้องกัน" ใด ๆ ต่อไปนี้จะใช้งานได้
find -name up'*'
find -name up"*"
find -name up\*
find -name 'up*'
find -name "up*"
find -name "up"\*
โปรดทราบว่าเชลล์จะไม่ขยายตัวในสิ่งใดใน'
เครื่องหมายคำพูดเดี่ยว'
... "
เครื่องหมายคำพูดคู่"
เป็นเรื่องราวที่แตกต่าง ..
then you need to ensure that it is NOT escaped when find actually reads the pattern from the command line.
สับสนต่อไปโดยTo protect it you MUST escape it at the command-line level
Note that the shell will never perform expansion on anything in 'single quotes' ... "double quotes" are a different story.
ดังนั้นเมื่อดูที่คำแถลงแรกที่คุณพูดถึงมันจะต้องไม่หนี