จากman find
:
คำสั่ง -exec
ดำเนินการคำสั่ง; เป็นจริงถ้าส่งคืนสถานะ 0 อาร์กิวเมนต์ต่อไปนี้เพื่อค้นหาทั้งหมดจะถูกนำไปเป็นอาร์กิวเมนต์ของคำสั่งจนกว่าอาร์กิวเมนต์ประกอบด้วย ';' พบ สตริง '{}' ถูกแทนที่ด้วยชื่อไฟล์ปัจจุบันที่ถูกประมวลผลทุกที่ที่เกิดขึ้นในอาร์กิวเมนต์ของคำสั่งไม่ใช่เฉพาะในอาร์กิวเมนต์ที่อยู่คนเดียวเช่นเดียวกับในบางรุ่นของการค้นหา ทั้งสองสิ่งก่อสร้างเหล่านี้อาจจำเป็นต้องหลบหนี (ด้วย '\') หรือยกมาเพื่อป้องกันพวกเขาจากการขยายตัวโดยเปลือก ดูส่วนตัวอย่างวินาทีสำหรับตัวอย่างของการใช้ตัวเลือก '-exec' คำสั่งที่ระบุจะรันหนึ่งครั้งสำหรับแต่ละไฟล์ที่ตรงกัน
คำสั่งจะถูกดำเนินการในไดเรกทอรีเริ่มต้น มีปัญหาด้านความปลอดภัยที่หลีกเลี่ยงไม่ได้รอบการใช้ตัวเลือก -exec
คำสั่ง -exec {} +
แตกต่างจาก -exec ตัวเลือกนี้จะทำงานคำสั่งที่ระบุไว้บนไฟล์ที่เลือก แต่บรรทัดคำสั่งที่ถูกสร้างขึ้นโดยต่อท้ายชื่อไฟล์แต่ละเลือกที่สิ้นสุด ; จำนวนการร้องขอคำสั่งทั้งหมดจะน้อยกว่าจำนวนไฟล์ที่ตรงกัน บรรทัดคำสั่งสร้างขึ้นในลักษณะเดียวกับที่ xargs สร้างบรรทัดคำสั่ง อนุญาตเพียงหนึ่งอินสแตนซ์ของ '{}' ภายในคำสั่ง คำสั่งจะถูกดำเนินการในไดเรกทอรีเริ่มต้น
ดังนั้นวิธีที่ฉันเข้าใจจะ\;
ดำเนินการคำสั่งแยกต่างหากสำหรับแต่ละไฟล์ที่พบโดยfind
ในขณะที่\+
ผนวกไฟล์และดำเนินการคำสั่งเดียวในทุกไฟล์ The \
เป็นตัวละครหนีดังนั้นมัน:
ls testdir1; ls testdir2
VS
ls testdir1 testdir2
การทำข้างบนในเปลือกของฉันทำมิเรอร์ผลลัพธ์ในคำถามของคุณ
ตัวอย่างของเวลาที่คุณต้องการใช้ \+
สมมติว่าสองไฟล์1.tmp
และ2.tmp
:
1.tmp:
1
2
3
2.tmp:
0
2
3
ด้วย\;
:
find *.tmp -exec diff {} \;
> diff: missing operand after `1.tmp'
> diff: Try `diff --help' for more information.
> diff: missing operand after `2.tmp'
> diff: Try `diff --help' for more information.
โดยที่ถ้าคุณใช้\+
(เพื่อต่อผลลัพธ์ของfind
):
find *.tmp -exec diff {} \+
1c1,3
< 1
---
> 0
> 2
> 30
ดังนั้นในกรณีนี้มันคือความแตกต่างระหว่างdiff 1.tmp; diff 2.tmp
และdiff 1.tmp 2.tmp
มีหลายกรณีที่\;
เหมาะสมและ\+
จำเป็น ใช้\+
กับrm
เป็นหนึ่งในตัวอย่างดังกล่าวซึ่งถ้าคุณกำลังลบเป็นจำนวนมากของการทำงานของไฟล์ (ความเร็ว) \;
จะดีกว่า