คุณสามารถใช้ 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' {} +