ฉันพยายามเรียกใช้คำสั่งต่อไปนี้:
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' +
นี่กำลังส่งคืนข้อผิดพลาด:
find: missing argument to -exec
ฉันไม่เห็นว่ามีอะไรผิดปกติกับคำสั่งนี้เนื่องจากดูเหมือนจะตรงกับหน้าคน:
คำสั่ง -exec {} +
ตัวแปรของตัวเลือก -exec นี้จะรันคำสั่งที่ระบุในไฟล์ที่เลือก แต่บรรทัดคำสั่งจะถูกสร้างขึ้นโดยการต่อท้ายชื่อไฟล์ที่เลือกแต่ละชื่อที่ท้าย จำนวนรวมของคำสั่งจะน้อยกว่าจำนวนไฟล์ที่ตรงกัน บรรทัดคำสั่งถูกสร้างขึ้นในลักษณะเดียวกับที่ xargs สร้างบรรทัดคำสั่ง อนุญาตเพียงหนึ่งอินสแตนซ์ของ '{}' ภายในคำสั่ง คำสั่งจะถูกดำเนินการในไดเรกทอรีเริ่มต้น
ฉันก็ลอง:
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar {} +
find a/folder b/folder -name *.c -o -name *.h -exec 'grep -I foobar' {} +
find a/folder b/folder -name *.c -o -name *.h -exec 'grep -I foobar' '{}' +
find a/folder b/folder -name "*.c" -o -name "*.h" -exec grep -I foobar '{}' +
find a/folder b/folder \( -name *.c -o -name *.h \) -exec grep -I foobar '{}' +
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+
findGNU แม้ว่า-exec cmd {} +ตัวแปรคือ POSIX และมีให้บริการตั้งแต่ยุค 80 แต่ GNU พบว่าเพิ่งเพิ่ม (ค่อนข้าง) เมื่อเร็ว ๆ นี้ (2005) สิ่งที่ไม่find --versionบอกคุณ?
-exec {} +ถูกเพิ่มใน 4.2.12 ในปี 2005 ใน GNU ที่เก่ากว่าพบว่าคุณสามารถใช้ (ไม่ใช่ POSIX) -print0 | xargs -r0เพื่อให้ได้สิ่งที่คล้ายกัน 4.1คือตั้งแต่ปี 1994
-nameรูปแบบควรถูกยกมา: -name "*.c" -o -name "*.h". สิ่งนี้เป็นจริงแม้ว่าจะไม่เกี่ยวข้องกับ-execข้อผิดพลาด คุณจะสังเกตเห็นว่าคำตอบอื่น ๆ ทั้งหมดใส่สัญลักษณ์แทนลงในเครื่องหมายอัญประกาศแม้ว่า Gilles จะพูดถึงมันเท่านั้น … (ต่อ)
-name "*.[ch]"โดยไม่มีคำอธิบาย -oซึ่งมีประโยชน์ในการลดความซับซ้อนของบรรทัดคำสั่งและโดยเฉพาะกำจัด ค้นหานิพจน์ที่เกี่ยวข้อง-oนั้นยากที่จะทำให้ถูกต้อง ของคุณผิด หากคำสั่งของคุณได้รับการแก้ไขเพื่อไม่ให้เกิดข้อผิดพลาด (เช่นในคำตอบของ Gilles) คำสั่งนั้นจะทำงานgrepเฉพาะ.hไฟล์เท่านั้น '(' -name '*.c' -o -name '*.h' ')'ที่คุณต้องทำ
+ในตอนท้ายหรือไม่?find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+