สำหรับบันทึกนี่เป็นวิธีที่ฉันชอบ:
grep pattern $(find . -type f ! -path './test/main.cpp')
โดยการรักษาgrep
ที่จุดเริ่มต้นของคำสั่งฉันคิดว่านี่เป็นสิ่งที่ชัดเจนมากขึ้นบวกกับมันไม่ได้ปิดการใช้งานการgrep
เน้นสี ในแง่หนึ่งการใช้find
คำสั่งในการแทนที่คำสั่งเป็นเพียงวิธีการขยาย / แทนที่ (จำกัด ) การค้นหาไฟล์ย่อยของgrep
ฟังก์ชันการทำงานของ
สำหรับฉันแล้วfind -exec
ไวยากรณ์เป็นชนิดของความลับ ความซับซ้อนอย่างหนึ่งfind -exec
คือ (บางครั้ง) จำเป็นสำหรับการหลีกเลี่ยงอักขระต่าง ๆ (โดยเฉพาะถ้า\;
ใช้ภายใต้ Bash) เพียงเพื่อวัตถุประสงค์ในการใส่สิ่งต่าง ๆ ลงในบริบทที่คุ้นเคยคำสั่งสองคำสั่งต่อไปนี้จะเทียบเท่าโดยทั่วไป:
find . ! -path ./test/main.cpp -type f -exec grep pattern {} +
find . ! -path ./test/main.cpp -type f -print0 |xargs -0 grep pattern
หากคุณต้องการยกเว้นไดเรกทอรีย่อยคุณอาจจำเป็นต้องใช้สัญลักษณ์แทน ฉันไม่เข้าใจโครงสร้างที่นี่ - พูดคุยเกี่ยวกับความลับ :
grep pattern $(find . -type f ! -path './test/main.cpp' ! -path './lib/*' )
หมายเหตุเพิ่มเติมอีกข้อหนึ่งสำหรับการใช้งานfind
โซลูชันพื้นฐานทั่วไปสำหรับสคริปต์ : grep
บรรทัดคำสั่งควรมีตัวเลือก-H
/ มิฉะนั้นมันจะเปลี่ยนการแสดงผลการจัดรูปแบบภายใต้สถานการณ์ที่มีเกิดขึ้นเป็นเพียงคนเดียวที่ชื่อไฟล์ในผลการค้นหาจาก--with-filename
find
สิ่งนี้น่าทึ่งเพราะไม่จำเป็นถ้าใช้grep
การค้นหาไฟล์ดั้งเดิม (พร้อม-r
ตัวเลือก)
... ยิ่งกว่านั้นคือการรวม/dev/null
เป็นไฟล์แรกในการค้นหา วิธีนี้ช่วยแก้ปัญหาสองข้อ:
- จะช่วยให้มั่นใจว่าหากมีไฟล์เดียวที่จะค้นหา
grep
จะคิดว่ามีสองไฟล์และใช้โหมดเอาต์พุตหลายไฟล์
- จะช่วยให้มั่นใจได้ว่าหากไม่มีไฟล์ที่จะค้นหา
grep
จะคิดว่ามีหนึ่งไฟล์และไม่หยุดรอ stdin
ดังนั้นคำตอบสุดท้ายคือ:
grep pattern /dev/null $(find . -type f ! -path './test/main.cpp')
--exclude-dir
) นั่นเป็นเหตุผลที่ฉันต้องการให้ grep ทำการยกเว้นโดยกำเนิด