คุณสามารถใช้ globstar ได้เช่นกัน
การสร้างgrepคำสั่งด้วยfindเช่นเดียวกับในคำตอบของ Zannaเป็นวิธีที่มีความทนทานสูงอเนกประสงค์และพกพาได้ในการทำเช่นนี้ (ดูคำตอบของ sudodus ด้วย ) และMuru ได้โพสต์วิธีการที่ดีเยี่ยมของการใช้grepของ--includeตัวเลือก แต่ถ้าคุณต้องการใช้เพียงแค่grepคำสั่งและเชลล์ของคุณมีวิธีอื่นในการทำมัน - คุณสามารถทำให้เชลล์ตัวเองทำการเรียกซ้ำที่จำเป็น :
shopt -s globstar # you can skip this if you already have globstar turned on
grep -H 'pattern' **/file.txt
การ-Hตั้งค่าสถานะทำให้grepแสดงชื่อไฟล์แม้ว่าจะพบไฟล์ที่ตรงกันเพียงหนึ่งไฟล์ คุณสามารถส่งต่อ-aและ-i, -n(จากตัวอย่างของคุณ) ไปยังgrepเช่นกันหากนั่นคือสิ่งที่คุณต้องการ แต่อย่าผ่าน-rหรือ-Rเมื่อใช้วิธีนี้ มันเป็นเปลือกที่ recurses ไดเรกทอรีในการขยายรูปแบบ glob ที่มี**และไม่ได้grep
คำแนะนำเหล่านี้ใช้เฉพาะกับ Bash shell Bash เป็นเชลล์ผู้ใช้เริ่มต้นใน Ubuntu (และระบบปฏิบัติการ GNU / Linux อื่น ๆ ส่วนใหญ่) ดังนั้นถ้าคุณอยู่บน Ubuntu และไม่รู้ว่าเชลล์ของคุณคืออะไร ถึงแม้ว่าเชลล์ยอดนิยมมักจะสนับสนุนการโกรฟไดเรคทอรี่ที่ข้ามเส้นทาง**แต่มันก็ไม่ได้ทำงานในลักษณะเดียวกัน สำหรับข้อมูลเพิ่มเติมโปรดดูที่Stéphane Chazelas 's คำตอบที่ดีเพื่อผลมาจากคำสั่ง ls *, ** การ LS และ LS ***ในUnix.SE
มันทำงานอย่างไร
การเปิดGLOBSTARทุบตีตัวเลือกเปลือกทำให้**เส้นทางการแข่งขันที่มีคั่นไดเรกทอรี ( /) มันจึงเป็นไดเรกทอรีเรียกซ้ำ โดยเฉพาะตามที่man bashอธิบาย:
เมื่อเปิดใช้งานตัวเลือกglobstar shell และ * ถูกใช้ในบริบทการขยายชื่อพา ธ * s ที่อยู่ติดกันสองตัวที่ใช้เป็นรูปแบบเดียวจะจับคู่ไฟล์ทั้งหมดและไดเรกทอรีหรือไดเรกทอรีย่อยหรือไดเรกทอรีศูนย์หรือมากกว่า หากตามด้วย a / สอง * s ที่อยู่ติดกันจะจับคู่เฉพาะไดเรกทอรีและไดเรกทอรีย่อย
คุณควรจะระมัดระวังเกี่ยวกับเรื่องนี้เนื่องจากคุณสามารถเรียกใช้คำสั่งที่ปรับเปลี่ยนหรือลบไฟล์ที่ไกลมากขึ้นกว่าที่คุณตั้งใจโดยเฉพาะอย่างยิ่งถ้าคุณเขียนเมื่อคุณหมายถึงการเขียน** *(ปลอดภัยในคำสั่งนี้ซึ่งไม่เปลี่ยน iles ใด ๆ ) shopt -u globstarปิดตัวเลือก globstar shell ออก
มีความแตกต่างในทางปฏิบัติระหว่าง globstar และfind.
findมีความหลากหลายมากขึ้นกว่า globstar ทุกสิ่งที่คุณสามารถทำได้ด้วย globstar คุณสามารถทำได้ด้วยfindคำสั่งเช่นกัน ฉันชอบ GLOBSTAR และบางครั้งก็สะดวกมากขึ้น แต่ GLOBSTAR ไม่ได้เป็นทั่วไปfindทางเลือกในการ
.วิธีการดังกล่าวข้างต้นไม่ได้ดูภายในไดเรกทอรีที่มีชื่อขึ้นต้นด้วย บางครั้งคุณไม่ต้องการเรียกคืนโฟลเดอร์ดังกล่าว แต่บางครั้งคุณก็ทำ
เช่นเดียวกับ glob ทั่วไปเปลือกสร้างรายการของเส้นทางที่ตรงกันทั้งหมดและส่งผ่านพวกเขาเป็นอาร์กิวเมนต์ไปยังคำสั่งของคุณ ( grep) แทน glob ตัวเอง หากคุณมีไฟล์จำนวนมากที่เรียกfile.txtว่าคำสั่งผลลัพธ์จะยาวเกินไปสำหรับระบบที่จะเรียกใช้งานดังนั้นวิธีการด้านบนจะล้มเหลว ในทางปฏิบัติคุณต้องการไฟล์อย่างน้อยหลายพันไฟล์ แต่มันอาจเกิดขึ้นได้
วิธีการที่ใช้findไม่อยู่ภายใต้ข้อ จำกัด นี้เนื่องจาก:
วิธีของ Zannaสร้างและเรียกใช้grepคำสั่งด้วยอาร์กิวเมนต์ของพา ธ จำนวนมาก แต่หากพบไฟล์มากเกินกว่าที่จะแสดงรายการไว้ในพา ธ เดียวแอ็คชัน+-minminated -execจะรันคำสั่งด้วยบางพา ธจากนั้นรันไฟล์นั้นอีกครั้งด้วยพา ธ เพิ่มเติมและอื่น ๆ ในกรณีของgrepไอเอ็นจีสำหรับสตริงในหลายไฟล์สิ่งนี้ก่อให้เกิดพฤติกรรมที่ถูกต้อง
เช่นเดียวกับวิธีการของ globstar ที่ครอบคลุมที่นี่สิ่งนี้จะพิมพ์บรรทัดที่ตรงกันทั้งหมดพร้อมกับเส้นทางที่ผ่านแต่ละอัน
วิธี sudodusทำงานgrepแยกกันสำหรับแต่ละfile.txtพบ หากมีไฟล์จำนวนมากมันอาจช้ากว่าวิธีอื่น ๆ แต่ใช้งานได้
เมธอดนั้นค้นหาไฟล์และพิมพ์พา ธ ของพวกเขาตามด้วยบรรทัดที่ตรงกันหากมี นี่คือรูปแบบที่แตกต่างกันออกจากรูปแบบที่ผลิตโดยวิธีการของฉันZanna ของและMuru ของ
รับสีด้วย find
ข้อดีอย่างหนึ่งของการใช้ globstar คือโดยค่าเริ่มต้นบน Ubuntu grepจะให้ผลลัพธ์ที่เป็นสี แต่คุณสามารถรับสิ่งนี้ได้ง่ายfindเช่นกัน
บัญชีผู้ใช้ใน Ubuntu ถูกสร้างขึ้นด้วยนามแฝงที่ทำให้grepทำงานจริงๆgrep --color=auto(วิ่งalias grepเพื่อดู) มันเป็นสิ่งที่ดีที่จะนามแฝงสวยมากขยายเฉพาะเมื่อคุณออกพวกเขาโต้ตอบแต่มันหมายความว่าถ้าคุณต้องการที่findจะก่อให้เกิดgrepกับ--colorธงคุณจะต้องเขียนไว้อย่างชัดเจน ตัวอย่างเช่น:
find . -name file.txt -exec grep --color=auto -H 'pattern' {} +