ฉันพยายามเรียกใช้คำสั่งต่อไปนี้:
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 '{}' \+
find
GNU แม้ว่า-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 '{}' \+