ฉันจะใช้ grep เพื่อค้นหาไดเรกทอรีที่ไม่ได้จัดอันดับได้อย่างไร


21

อาจดูเหมือนว่าฉันกำลังถามสิ่งเดียวกันกับคำถามนี้แต่ฉันมีข้อกำหนดที่แตกต่างกัน นี่คือตัวอย่างของระบบไฟล์ของฉัน:

  • /รหัส/
    • ภายใน/
      • dev /
      • หลัก/
    • / ประชาชน
      • dev /
      • หลัก/
      • ปล่อย/
    • เครื่องมือ /

/code/internal/dev/, /code/public/dev/และ/code/tools/มีไดเรกทอรีย่อยหลายโครงการ ฉันทำงานเกือบเฉพาะในสาขา dev /code/internal/และ/code/public/และบ่อยครั้งที่ฉันต้องการค้นหาสตริงข้อความในไดเรกทอรีเหล่านั้นพร้อมกับ/code/tools/(ซึ่งไม่มีสาขา) ในกรณีเหล่านี้ฉันต้องทำสามคำสั่งแยกกัน:

$ grep -r "some string" /code/internal/dev/
$ grep -r "some string" /code/public/dev/
$ grep -r "some string" /code/tools/

ฉันต้องการทราบว่ามีคำสั่งเดียวในการทำเช่นนี้หรือไม่ ถ้าไม่ฉันจะต้องเขียนสคริปต์ทุบตีง่ายที่สุด

คำตอบ:


38

คุณสามารถต่อหลาย ๆ พา ธ เพื่อให้ grep ค้นหา:

grep -r "some string" /code/internal/dev/ /code/public/dev/ /code/tools/

ชัดเจนมาก ทำไมฉันไม่คิดอย่างนี้ล่ะ!
David Kennedy

ที่จริงแล้วนี่จะพ่นข้อผิดพลาดgrep: /code/internal/dev/*.cs: No such file or directoryเว้นแต่ฉันจะลบ*.csคำสั่งออกจาก นี่คือความผิดของฉันเพราะฉันใส่*.csในคำถามของฉันเดิม
David Kennedy

14

หากคุณต้องการใช้สัญลักษณ์แทนสูงสุด (และลำดับชั้นที่คุณโพสต์เสร็จสมบูรณ์) คุณสามารถทำได้

grep -r "some string" /code/{*/dev,tools}/*.cs

คำอธิบาย:

ขั้นตอนแรกที่ทำคือการขยายรายการ braced ขยายตัวไปfoo{bar,baz}qux foobarqux foobazquxนั่นคือมีคำแยกที่สร้างขึ้นสำหรับแต่ละรายการคั่นด้วยเครื่องหมายจุลภาคในรายการโดยมีส่วนนำหน้าและส่วนท้ายติดอยู่กับแต่ละรายการ คุณสามารถดูวิธีการทำงานโดยการทำ

echo A{1,2,3,4}B

ซึ่งผลลัพธ์

A1B A2B A3B A4B

โปรดทราบว่าวิธีนี้ใช้ได้กับการจัดฟันหลายครั้งและการมีอาร์กิวเมนต์ที่ว่างเปล่า ตัวอย่างเช่น

echo {,1,2}{0,1,2}:{2,3}

จะช่วยให้

0:2 0:3 1:2 1:3 2:2 2:3 10:2 10:3 11:2 11:3 12:2 12:3 20:2 20:3 21:2 21:3 22:2 22:3

ดังนั้นหลังจากรั้งการขยายคำสั่งของคุณจะเป็นดังนี้:

grep -r "some string" /code/*/dev/*.cs /code/tools/*.cs

ขั้นตอนต่อไปคือการขยายตัวสัญลักษณ์ คุณรู้แล้วว่าใน*.csส่วนนี้ แต่มันก็ใช้ได้กับไดเร็กตอรี่ระดับกลางด้วย; นอกจากนี้หาก/มีการจับคู่ไดเรกทอรีเท่านั้น ดังนั้นเมื่อมีลำดับชั้นของคุณ (และสร้างชื่อไฟล์สำหรับ.csไฟล์) คุณจะได้รับคำสั่ง:

grep -r "some string" /code/internal/dev/file1.cs /code/internal/dev/file2.cs /code/public/dev/file3.cs /code/tools/file4.cs /code/tools/file5.cs

หลังจากเหตุการณ์ทั้งหมดนี้เกิดขึ้นแล้วgrepจะถูกเรียกด้วยรายการอาร์กิวเมนต์นี้ (โปรดทราบว่าสิ่งเดียวกันนี้เกิดขึ้นกับคำสั่งดั้งเดิมของคุณ; grepไม่เคยได้เห็นการ*ขยายที่ทำได้โดยbashก่อนโทรมาgrep)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.