อะไรคือความหมายของ {} + ในคำสั่ง -exec ของ find?


23

ฉันต้องการที่จะทราบความหมายของ{} +ในexecคำสั่งและสิ่งที่เป็นความแตกต่างระหว่างและ{} + {} \;ตามจริงแล้วอะไรคือความแตกต่างระหว่างสองสิ่งนี้:

find . -type f -exec chmod 775 {} +
find . -type f -exec chmod 775 {} \;

5
มันอธิบายไว้ในman find(1)รายละเอียดมากใคร ๆ ก็สามารถหาได้ง่าย อย่าขี้เกียจ
Miroslav Koškár

ขอบคุณ Miroslav ที่รักฉันค้นหาด้วยman exec!

อาฉันไม่เคยเจอการ{} +ใช้งานมาก่อน ปกติแล้วฉันจะใช้ xargs สำหรับ (และบ่อยครั้งfind ... -print0 | xargs -0 ...)

คำตอบ:


27

การใช้;(อัฒภาค) หรือ+(บวก) มีผลบังคับใช้ในคำสั่งยกเลิกคำสั่งเปลือกเรียกโดย/-execexecdir

ความแตกต่างระหว่าง;(เซมิโคลอน) หรือ+(เครื่องหมายบวก) คือวิธีที่อาร์กิวเมนต์ส่งผ่านไปยัง find's -exec/ -execdirพารามิเตอร์ ตัวอย่างเช่น:

  • การใช้;จะดำเนินการหลายคำสั่ง (แยกกันสำหรับแต่ละอาร์กิวเมนต์)

    ตัวอย่าง:

    $ find /etc/rc* -exec echo Arg: {} ';'
    Arg: /etc/rc.common
    Arg: /etc/rc.common~previous
    Arg: /etc/rc.local
    Arg: /etc/rc.netboot
    

    อาร์กิวเมนต์ทั้งหมดต่อไปนี้ที่จะfindถูกนำไปเป็นอาร์กิวเมนต์ของคำสั่ง

    สตริง{}จะถูกแทนที่ด้วยชื่อไฟล์ปัจจุบันที่กำลังประมวลผล

  • การใช้ +จะดำเนินการคำสั่งที่เป็นไปได้น้อยที่สุด (เนื่องจากมีการรวมอาร์กิวเมนต์เข้าด้วยกัน) มันคล้ายกันมากกับวิธีการxargsทำงานของคำสั่งดังนั้นมันจะใช้อาร์กิวเมนต์เป็นจำนวนมากต่อคำสั่งเท่าที่จะทำได้เพื่อหลีกเลี่ยงการเกินขีด จำกัด สูงสุดของอาร์กิวเมนต์ต่อบรรทัด

    ตัวอย่าง:

    $ find /etc/rc* -exec echo Arg: {} '+'
    Arg: /etc/rc.common /etc/rc.common~previous /etc/rc.local /etc/rc.netboot
    

    บรรทัดคำสั่งถูกสร้างโดยการต่อท้ายชื่อไฟล์ที่เลือกแต่ละชื่อที่ท้าย

    หนึ่งอินสแตนซ์ของ {}ภายในคำสั่ง

ดูสิ่งนี้ด้วย:


มีคือความแตกต่างและหนึ่งที่สำคัญ ดูคำตอบของผู้ใช้ 1116056
Jahid

24

ระบุว่าคำสั่ง find จะได้รับไฟล์ต่ำกว่าสามไฟล์:

fileA
fileB
fileC

หากคุณใช้-execกับเครื่องหมายบวก ( +)

find . -type f -exec chmod 775 {} +  

มันจะเป็น:

chmod 775 fileA fileB fileC

บรรทัดคำสั่งถูกสร้างโดยการต่อท้ายชื่อไฟล์ที่ตรงกันแต่ละชื่อที่ท้ายซึ่งอยู่ในลักษณะเดียวกันกับที่ xargsสร้างบรรทัดคำสั่ง จำนวนการเรียกใช้คำสั่งทั้งหมด ( chmodในกรณีนี้) จะน้อยกว่าจำนวนไฟล์ที่จับคู่มาก

หากคุณใช้-execกับอัฒภาค ( ;)

find . -type f -exec chmod 775 {} \;

มันจะเป็น:

chmod 775 fileA
chmod 775 fileB
chmod 775 fileC

5

ตามman find:

คำสั่ง -exec {} +ตัวแปรของการดำเนินการ -exec นี้รันคำสั่งที่ระบุในไฟล์ที่เลือก แต่บรรทัดคำสั่งจะถูกสร้างโดยการต่อท้ายชื่อไฟล์ที่เลือกแต่ละชื่อที่ท้าย จำนวนการเรียกใช้คำสั่งทั้งหมดจะน้อยกว่าจำนวนไฟล์ที่ตรงกัน บรรทัดคำสั่งถูกสร้างขึ้นในลักษณะเดียวกับที่ xargs สร้างบรรทัดคำสั่ง อนุญาตเพียงหนึ่งอินสแตนซ์ของ '{}' ภายในคำสั่ง คำสั่งจะถูกดำเนินการในไดเรกทอรีเริ่มต้น

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