ปัญหาที่คุณกำลังหันหน้าไปก็คือว่าเปลือกแรกแยกวิเคราะห์บรรทัดคำสั่งและเห็นทั้งสองคำสั่งง่ายๆแยกจากกันโดย&&
ผู้ประกอบการ: และfind . -iname \*.csv -exec grep foo {}
echo {} \;
เธซเธฑ&&
( find . -iname \*.csv -exec grep foo {} '&&' echo {} \;
) ทะลุว่า แต่ตอนนี้คำสั่งดำเนินการโดยfind
เป็นสิ่งที่ต้องการgrep
ด้วยข้อโต้แย้งfoo
, wibble.csv
, &&
, และecho
wibble.csv
คุณต้องสั่งfind
ให้เรียกใช้เชลล์ที่จะตีความ&&
โอเปอเรเตอร์:
find . -iname \*.csv -exec sh -c 'grep foo "$0" && echo "$0"' {} \;
หมายเหตุว่าอาร์กิวเมนต์แรกหลังจากที่sh -c SOMECOMMAND
เป็นไม่ได้$0
$1
-exec … +
คุณสามารถบันทึกเวลาเริ่มต้นของกระบวนการเปลือกสำหรับทุกไฟล์โดยการจัดกลุ่มสวดคำสั่งด้วย เพื่อความสะดวกในการประมวลผลให้ส่งค่าดัมมี่บางส่วน$0
เพื่อ"$@"
ระบุชื่อไฟล์
find . -iname \*.csv -exec sh -c 'for x in "$@"; do grep foo "$x" && echo "$x"; done' \ {} +
หากคำสั่งเชลล์เป็นเพียงสองโปรแกรมคั่นด้วย&&
, find
สามารถทำงานด้วยตัวเอง: การเขียนเป็นลำดับสอง-exec
กระทำและคนที่สองจะได้รับการดำเนินการอย่างใดอย่างหนึ่งถ้าออกครั้งแรกกับสถานะ 0
find . -iname \*.csv -exec grep foo {} \; -exec echo {} \;
(ผมคิดว่าgrep
และecho
เป็นเพียงเพื่อวัตถุประสงค์ภาพประกอบเป็น-exec echo
จะถูกแทนที่ด้วย-print
และผลผลิตที่เกิดขึ้นไม่ได้โดยเฉพาะอย่างยิ่งอยู่แล้วที่มีประโยชน์.)
-exec
-exec sh -c 'grep foo "$0" && printf %s\\n "$0"' {} \;