อะไรคือความแตกต่างระหว่างการใช้ '+' (บวก) และ ';' (เซมิโคลอน) ในคำสั่ง -exec


28

ฉันสงสัยว่าจะรู้ว่าอะไรคือความแตกต่างระหว่างการใช้+และ;เมื่อสิ้นสุด-execคำสั่งเมื่อใช้ในการfindบังคับบัญชา?

find .... -exec ... \; 

VS

find .... -exec ... + 

คำตอบ:


36

-exec ... \;จะเรียกใช้หนึ่งรายการหลังจากนั้นอีกหนึ่งรายการ ดังนั้นหากคุณมีสามไฟล์บรรทัด exec จะทำงานสามครั้ง

-exec ... {} +สำหรับคำสั่งที่สามารถใช้เวลามากกว่าหนึ่งไฟล์ในเวลา (เช่นcat, stat, ls) ไฟล์ที่ค้นพบfindถูกโยงเข้าด้วยกันเหมือนxargsคำสั่ง นี่หมายถึงการฟอร์กออกน้อยกว่าและสำหรับการดำเนินการขนาดเล็กอาจหมายถึงการเร่งความเร็วอย่างมาก

นี่คือตัวอย่างของประสิทธิภาพที่แสดงไฟล์เปล่า 10,000 ไฟล์

$ mkdir testdir
$ touch testdir/{0000..9999}

$ time find testdir/ -type f -exec cat {} \;
real    0m8.622s
user    0m0.452s
sys     0m8.288s

$ time find testdir/ -type f -exec cat {} +
real    0m0.052s
user    0m0.015s
sys     0m0.037s

คำสั่งนี้ใช้งานได้กับคำสั่งที่สามารถใช้หลายชื่อไฟล์ได้เท่านั้น คุณสามารถออกกำลังกายได้หากคำสั่งของคุณเป็นเช่นนั้นโดยดูที่ manpage นี่คือบทสรุปจากman cat:

SYNOPSIS
       cat [OPTION]... [FILE]...

จุดไข่ปลาเปิด[FILE]...หมายความว่าสามารถใช้ไฟล์มากกว่าหนึ่งไฟล์

+สามารถใช้ได้กับคำสั่งเดียวเท่านั้นและคุณต้องมีหนึ่งคำสั่ง{}ในบรรทัด \;สามารถทำงานกับกลุ่มศูนย์หลายกลุ่ม


4
ตัวอย่าง: มีคำสั่งดำเนินการจะเป็น\; cat 1; cat 2; cat 3ด้วยคำสั่งดำเนินการจะเป็น+ cat 1 2 3
Alaa Ali

AFAIK +ไม่ใช่ POSIX ดังนั้นอาจไม่สามารถใช้งานได้กับระบบที่ไม่ใช่ Linux ไม่ต้องกังวลหากคุณไม่เคยออกจากแพลตฟอร์ม แต่เป็นการดีที่จะรู้ว่าคุณต้องใช้โซลาริสหรือไม่ :)
Simon Richter

โอ้ดีขอบคุณสำหรับข้อมูล ฉันมักจะ-exec <command> {} ';'เพราะมันง่ายในการพิมพ์ของฉัน (ฉันสามารถสัมผัสประเภท แต่ฉันไม่ได้มีเทคนิคที่ดีที่สุด)
hanetzer

2
@SimonRichter: ไม่-exec ... {} +เป็น POSIX ดู: pubs.opengroup.org/onlinepubs/9699919799/utilities/…
cuonglm

@SimonRichter -exec ... {} +ส่วนขยายได้รับการแนะนำสำหรับการรวมไว้ใน POSIX specs ในปี 2001และให้สัตยาบันใน POSIX ฉบับที่ 6 ในปี 2004 เป็นไปได้ว่ารุ่นของ Solaris ที่คุณคุ้นเคยนั้นเก่ากว่ามาตรฐาน POSIX นั้น (หรือเพียงแค่กำหนดเป้าหมายรุ่นก่อนหน้า)
Oli
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.