ทำไมแบ็กสแลชก่อนที่จะใส่เครื่องหมายดอกจันใน `find '


9

ในคำสั่งนี้:

find . -name \*.pyc -delete

ทำไมเครื่องหมายจำเป็นก่อน*.pyc?


man page สำหรับfindควรมีส่วนที่เรียกNON-BUGSพร้อมกับสิ่งที่คล้ายกันเป็นตัวอย่างและคำอธิบายว่าทำไมจึงมีความจำเป็น
Brian

คำตอบ:


19

glob ที่ไม่มีเครื่องหมายจะถูกขยายโดยเชลล์ก่อนที่จะfindถูกเรียกใช้งาน (อ้างอิงถึงการขยายชื่อไฟล์ในคู่มือ)

ดังนั้นพูดว่า:

find . -name *.pyc -delete

จะดำเนินการจริง:

find . -name file1.pyc file2.pyc file3.pyc -delete

สมมติว่ามีไฟล์ 3 ไฟล์. pyc ในไดเรกทอรีปัจจุบันและทำให้เกิดข้อผิดพลาดแทน

แบ็กสแลชทำให้เชลล์ส่งผ่าน glob ไปยังfindนั่นคือทำหน้าที่เหมือน*.pycถูกยกมา

เป็นการดีที่คุณควรจะอ้างอิงวงกว้าง:

find . -name '*.pyc' -delete

@RamRachum แต่มีอักขระมากขึ้นเมื่อพิมพ์
Paul Draper

1
@ PaulDraper สามารถอ่านได้และมีแนวโน้มที่จะเกิดข้อผิดพลาดน้อยลง> สั้นลงด้วยการกดแป้นเดียว
Doorknob

คำพูดเดียวเป็นวิธีที่จะไป ฉันไม่เคยคิดแม้แต่คุณสามารถใช้เครื่องหมายในทางนี้ ...
อริส

4

ก่อนที่เปลือกของคุณประเด็นfindคำสั่งก็จะทำต่างๆขยาย การทำเช่นนั้นมันยังประมวลผลอักขระพิเศษ (หรือตัวละครที่มีความหมายพิเศษ) ซึ่ง*เป็นสัญลักษณ์แทน - ตัวอักษรกลม นี่คือการขยายชื่อไฟล์ที่เรียกว่า

สมมติว่าคุณมีสองไฟล์ในไดเรกทอรีของคุณ:

  • foo.pyc
  • bar.pyc

จากนั้น*.pycจะขยายเป็นชื่อทั้งสอง ดังนั้นถ้าคุณเขียน:

find . -name *.pyc -delete

จากนั้นเชลล์จะเรียกจริง:

find . -name foo.pyc bar.pyc -delete

ซึ่งไม่สมเหตุสมผลนักเนื่องจากคุณสามารถมีข้อโต้แย้งเพียงข้อเดียว-nameเท่านั้น นั่นเป็นเหตุผลที่คุณต้องหลบหนีอักขระพิเศษเพื่อป้องกันไม่ให้ถูกตีความโดยเชลล์ คุณทำเช่นนั้นโดยการใช้เครื่องหมายแบคสแลชหรือหลีกเลี่ยงการอ้างถึง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.