ปัญหาที่คุณกำลังหันหน้าไปก็คือว่าเปลือกแรกแยกวิเคราะห์บรรทัดคำสั่งและเห็นทั้งสองคำสั่งง่ายๆแยกจากกันโดย&&ผู้ประกอบการ: และ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"' {} \;