Unix 'grep' สำหรับสตริงภายในไฟล์ gzip ทั้งหมดในไดเรกทอรีย่อยทั้งหมด


คำตอบ:


13

@Steve Weet ใกล้จะถึงแล้ว การใช้ / dev / null เป็นอาร์กิวเมนต์เพิ่มเติมเป็นวิธีที่ดีในการบังคับให้แสดงชื่อไฟล์ (ฉันจะจำได้ว่าขอบคุณ Steve) แต่ก็ยังใช้งาน exec สำหรับไฟล์ทุกไฟล์ที่พบ - ค่าใช้จ่ายมาก

คุณต้องการรัน zgrep สองสามครั้งเท่าที่จะทำได้เพื่อให้ได้ประโยชน์สูงสุดจากการดำเนินการแต่ละครั้ง:

find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN

xargsจะจัดหา args (ชื่อไฟล์) ให้มากที่สุดเท่าที่จะทำได้เพื่อ zgrep และดำเนินการซ้ำ ๆ จนกว่าจะได้ใช้ไฟล์ทั้งหมดที่จัดทำโดยfindคำสั่ง การใช้-print0และ-0ตัวเลือกช่วยให้มันทำงานได้หากมีช่องว่างในชื่อไฟล์หรือไดเรกทอรี

บน Mac OS X คุณสามารถได้รับเอฟเฟกต์เดียวกันโดยไม่ต้อง xargs:

find . -iname '*.gz' -exec zgrep PATTERN {} +

+1 มันดีจริงๆ ฉันไม่ได้ตระหนักว่า xargs ผ่านการโต้แย้งมากกว่าหนึ่งข้อ บรรทัดคำสั่ง * nix ของฉันส่วนใหญ่มีอายุ 20 ปีและฉันไม่คิดว่า xargs ทำเช่นนั้นเมื่อ 20 ปีที่แล้ว
Steve Weet

มันจะเปิดออกพบว่าใน OS / x ทำงานแบบเดียวกับ xargs
สตีฟ Weet

1
ดูความคิดเห็นของฉันต่อคำตอบของ Steve Weet เกี่ยวกับ '+' ที่ลงท้ายด้วย -exec
Daniel Andersson

ใช้-Hเพื่อแสดงชื่อไฟล์ด้วยบรรทัดที่ตรงกันเสมอใน GNU grep อย่างน้อย
Daniel Andersson

1
$ zgrep --help
Usage: /bin/zgrep [OPTION]... [-e] PATTERN [FILE]...
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.

ดังนั้นสิ่งที่ชอบ

find . -iname "*.gz" -exec zgrep PATTERN {} \

-exec จะวางไข่อินสแตนซ์ใหม่ของ zgrep สำหรับทุกไฟล์ที่วนซ้ำเกินกว่าจะป้องกันไม่ให้คุณเห็นชื่อไฟล์ มันจะเป็นการดีกว่าถ้าจะใช้zgrep -rผ่านต้นไม้หรือหาก -r ไม่ทำงานให้ส่งออกข้อมูลการค้นหาผ่านxargs zgrep
Noufal Ibrahim

ฉัน/bin/zgrep: -r: option not supportedใช้ระบบ Ubuntu ที่เพิ่งติดตั้งใหม่
aioobe

คุณสามารถใช้xargsแทนแล้ว
Noufal Ibrahim

ดูความคิดเห็นของฉันต่อคำตอบของ Steve Weet เกี่ยวกับ '+' ที่ลงท้ายด้วย -exec
Daniel Andersson

1

@aioobe ใกล้จะถึงแล้ว คำสั่งจะทำงาน แต่จะไม่บอกชื่อไฟล์ให้คุณทราบ

ต่อไปนี้ควรบอกชื่อไฟล์ด้วย:

find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;

การเพิ่ม/dev/nullจะทำให้แน่ใจว่า zgrep เห็นชื่อไฟล์สองไฟล์ดังนั้นมันจะแสดงชื่อของไฟล์ให้คุณหากพบว่าเป็นสตริง

แก้ไข

การวิจัยเพิ่มเติมพบว่าสำหรับเครื่องของฉัน (OS / X) -execข้อโต้แย้งในการค้นหาจะเพิ่มชื่อไฟล์ให้มากที่สุดเท่าที่จะเป็นไปได้ (คล้ายกับวิธีการxargsทำงาน)


มันเจ๋งมากฉันไม่รู้เกี่ยวกับ OSX -exec- ฉันทุกคนเกี่ยวกับการพกพาดังนั้นฉันจะไม่ใช้มันในสคริปต์ แต่ยอดเยี่ยมสำหรับพรอมต์คำสั่ง

สำหรับการค้นหารุ่นอื่น ๆ ให้ใช้ '+' แทน '\;' ในการสิ้นสุดคำสั่ง exec จะทำเช่นเดียวกันกับ OSX ตามเรื่องราวในหัวข้อนี้โดยค่าเริ่มต้น ดูรายการคู่มือสำหรับ '-exec command {} +' มันไม่เป็นความจริงสำหรับทุกรุ่นfindแต่ส่วนใหญ่เป็นรุ่นที่ทันสมัย ​​(เช่นใน Distros ที่ใช้ Debian)
Daniel Andersson

ใช้-Hเพื่อแสดงชื่อไฟล์ที่มีบรรทัดที่ตรงกันเสมอใน GNU grep อย่างน้อยแทนที่จะเป็น/dev/nullแฮ็ค
Daniel Andersson

0

งานดังต่อไปนี้ได้รับการปฏิบัติ zsh

for archive in **/*.gz; do
    echo "[${archive}] "
    gzip -dc ${archive} | grep -n "String"
done

นอกจากนี้ยังอาจทำงานในbash, kshฯลฯ ...

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