หน้าคู่มือ (หรือคู่มือ GNU ออนไลน์ ) สวยมากอธิบายทุกอย่าง
ค้นหาคำสั่ง -exec {} \;
สำหรับแต่ละผลลัพธ์command {}
จะถูกดำเนินการ การเกิดขึ้นทั้งหมด{}
จะถูกแทนที่ด้วยชื่อไฟล์ ;
ถูกนำหน้าด้วยเครื่องหมายทับเพื่อป้องกันไม่ให้เชลล์แปลความหมาย
ค้นหาคำสั่ง -exec {} +
ผลลัพธ์แต่ละรายการจะถูกต่อท้ายcommand
และดำเนินการในภายหลัง เมื่อคำนึงถึงข้อจำกัดความยาวของคำสั่งฉันเดาว่าคำสั่งนี้อาจถูกเรียกใช้หลายครั้งโดยที่หน้าคู่มือรองรับฉัน:
จำนวนการเรียกใช้คำสั่งทั้งหมดจะน้อยกว่าจำนวนไฟล์ที่ตรงกันมาก
สังเกตคำพูดนี้จากหน้าคู่มือ:
บรรทัดคำสั่งสร้างขึ้นในลักษณะเดียวกับที่ xargs สร้างบรรทัดคำสั่ง
นั่นเป็นเหตุผลที่ไม่อนุญาตให้ใช้อักขระระหว่าง{}
และ+
ยกเว้นเว้นวรรค ทำให้พบว่าตรวจพบว่าข้อโต้แย้งที่ควรจะต่อท้ายคำสั่งเช่นเดียวกับ+
xargs
การแก้ไขปัญหา
โชคดีที่การดำเนินงานของ GNU mv
สามารถยอมรับไดเรกทอรีเป้าหมายเป็นอาร์กิวเมนต์ด้วยหรือพารามิเตอร์อีกต่อไป-t
--target
การใช้งานจะเป็น:
mv -t target file1 file2 ...
find
คำสั่งของคุณกลายเป็น:
find . -type f -iname '*.cpp' -exec mv -t ./test/ {} \+
จากหน้าคู่มือ:
คำสั่ง -exec;
ดำเนินการคำสั่ง; true ถ้าสถานะ 0 ถูกส่งกลับ อาร์กิวเมนต์ที่จะค้นหาต่อไปนี้ทั้งหมดจะถูกนำไปเป็นอาร์กิวเมนต์ของคำสั่งจนกว่าอาร์กิวเมนต์ประกอบด้วย `; ' พบ สตริง `{} 'จะถูกแทนที่ด้วยชื่อไฟล์ปัจจุบันที่ถูกประมวลผลทุกที่ที่เกิดขึ้นในอาร์กิวเมนต์ของคำสั่งไม่ใช่เฉพาะในอาร์กิวเมนต์ที่อยู่เพียงอย่างเดียวเหมือนใน find บางเวอร์ชัน สิ่งปลูกสร้างทั้งสองนี้อาจจำเป็นต้องมีการ Escape (ด้วย \ ') หรือยกมาเพื่อป้องกันไม่ให้เปลือกขยายออก ดูส่วน EXAMPLES สำหรับตัวอย่างการใช้อ็อพชัน -exec คำสั่งที่ระบุจะรันหนึ่งครั้งสำหรับแต่ละไฟล์ที่ตรงกัน คำสั่งถูกดำเนินการในไดเร็กทอรีเริ่มต้น มีปัญหาด้านความปลอดภัยที่หลีกเลี่ยงไม่ได้เกี่ยวกับการใช้ -exec action; คุณควรใช้ตัวเลือก -execdir แทน
คำสั่ง -exec {} +
ตัวแปรของแอ็คชัน -exec นี้รันคำสั่งที่ระบุบนไฟล์ที่เลือก แต่บรรทัดคำสั่งถูกสร้างขึ้นโดยต่อท้ายชื่อไฟล์ที่เลือกแต่ละไฟล์ในตอนท้าย จำนวนการเรียกใช้คำสั่งทั้งหมดจะน้อยกว่าจำนวนไฟล์ที่ตรงกันมาก บรรทัดคำสั่งสร้างขึ้นในลักษณะเดียวกับที่ xargs สร้างบรรทัดคำสั่ง อนุญาตให้ใช้อินสแตนซ์ของ {} เพียงหนึ่งอินสแตนซ์ภายในคำสั่ง คำสั่งถูกดำเนินการในไดเร็กทอรีเริ่มต้น