ฉันสงสัยว่าจะรู้ว่าอะไรคือความแตกต่างระหว่างการใช้+
และ;
เมื่อสิ้นสุด-exec
คำสั่งเมื่อใช้ในการfind
บังคับบัญชา?
find .... -exec ... \;
VS
find .... -exec ... +
ฉันสงสัยว่าจะรู้ว่าอะไรคือความแตกต่างระหว่างการใช้+
และ;
เมื่อสิ้นสุด-exec
คำสั่งเมื่อใช้ในการfind
บังคับบัญชา?
find .... -exec ... \;
VS
find .... -exec ... +
คำตอบ:
-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]...
หมายความว่าสามารถใช้ไฟล์มากกว่าหนึ่งไฟล์
+
สามารถใช้ได้กับคำสั่งเดียวเท่านั้นและคุณต้องมีหนึ่งคำสั่ง{}
ในบรรทัด \;
สามารถทำงานกับกลุ่มศูนย์หลายกลุ่ม
+
ไม่ใช่ POSIX ดังนั้นอาจไม่สามารถใช้งานได้กับระบบที่ไม่ใช่ Linux ไม่ต้องกังวลหากคุณไม่เคยออกจากแพลตฟอร์ม แต่เป็นการดีที่จะรู้ว่าคุณต้องใช้โซลาริสหรือไม่ :)
-exec <command> {} ';'
เพราะมันง่ายในการพิมพ์ของฉัน (ฉันสามารถสัมผัสประเภท แต่ฉันไม่ได้มีเทคนิคที่ดีที่สุด)
-exec ... {} +
เป็น POSIX ดู: pubs.opengroup.org/onlinepubs/9699919799/utilities/…
-exec ... {} +
ส่วนขยายได้รับการแนะนำสำหรับการรวมไว้ใน POSIX specs ในปี 2001และให้สัตยาบันใน POSIX ฉบับที่ 6 ในปี 2004 เป็นไปได้ว่ารุ่นของ Solaris ที่คุณคุ้นเคยนั้นเก่ากว่ามาตรฐาน POSIX นั้น (หรือเพียงแค่กำหนดเป้าหมายรุ่นก่อนหน้า)
\;
cat 1; cat 2; cat 3
ด้วยคำสั่งดำเนินการจะเป็น+
cat 1 2 3