ทำไมฉันถึงหา * main.o แต่ไม่สามารถ * .o ได้?


19

อันนี้ถูกต้อง:

$ find . -name *main.o
./main.o

ดังนั้นทำไมฉันไม่สามารถหา*.o?

$ find . -name *.o
find: paths must precede expression: main.o
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

2
ทำซ้ำกับaskubuntu.com/questions/112722/… ?
TJ Crowder

คนที่คุณโทรถูกต้องก็ผิดเช่นกัน หากมีการจับคู่หนึ่งรายการในไดเรกทอรีปัจจุบันและอีกรายการที่ตรงกันในไดเรกทอรีย่อยจะไม่สามารถค้นหาทั้งคู่เว้นแต่ว่าทั้งคู่จะมีชื่อเหมือนกัน ในตัวอย่างแรกของคุณอาจมีไฟล์ชื่อ./sub/domain.oซึ่งไม่พบ
kasperd

คำตอบ:


46

อาจมีมากกว่าหนึ่งไฟล์ที่ตรงกับ*.oในขณะที่มีเพียงหนึ่งไฟล์ที่ตรงกัน*main.oดังนั้นในกรณีแรกการขยายเชลล์จะทำงาน:

$ find . -name main.o

และงานนี้ ในกรณีที่สอง:

$ find . -name file1.o main.o

และนี่คือสาเหตุที่คุณได้รับข้อผิดพลาด

เพื่อป้องกันสิ่งนี้คุณควรอ้างอิงexpressionทั้งสองคำสั่ง:

$ find . -name '*.o'
$ find . -name '*main.o'

2
แท้จริงหนึ่งสามารถตรวจสอบเรื่องนี้กับVSecho *.o echo '*.o'
Ruslan

@Ruslan ขึ้นอยู่กับว่าถ้าไม่มีไฟล์ที่ตรงกับ glob ( *, ?) ทุบตีจะถือว่าเป็นตัวอักษรที่แท้จริง

@BroSlow ไม่ต้องสงสัยเลยฉันกำลังพูดถึงสถานการณ์เฉพาะที่ OP กำลังทำอยู่
Ruslan

16

ใส่รูปแบบไฟล์ในเครื่องหมายคำพูด มิเช่นนั้น * จะถูกขยายโดยเชลล์ (แก้ไขเป็นรายการไฟล์ก่อนที่จะเห็นมัน), find สับสน

find . -name "*.o"

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