ค้นหาสตริงในไฟล์ zip หลายไฟล์


22

ฉันกำลังทำงานกับ SunOS 5.10 ฉันมีโฟลเดอร์ที่มีไฟล์ zip ประมาณ 200 ไฟล์ ไฟล์ซิปแต่ละไฟล์มีไฟล์ข้อความเดียวเท่านั้น ฉันต้องการค้นหาสตริงเฉพาะในไฟล์ข้อความทั้งหมดในไฟล์ zip ทั้งหมด

ฉันลองสิ่งนี้ (ซึ่งค้นหาไฟล์ข้อความใด ๆ ในไฟล์ zip ที่มีสตริง "ORA-") แต่มันไม่ทำงาน

zipgrep ORA-1680 *.zip

อะไรที่ถูกต้องในการทำโดยไม่คลายการบีบอัดไฟล์ zip?


ดูเพิ่มเติมฉันจะ grep ซ้ำ ๆ ผ่านไฟล์บีบอัดได้อย่างไร? (ไม่ใช่สำเนาที่แน่นอนเพราะข้อกำหนดมีความซับซ้อนมากขึ้น)
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


26

โดยทั่วไปแล้วไม่สามารถค้นหาเนื้อหาภายในไฟล์บีบอัดได้โดยไม่ต้องบีบอัดไฟล์ไม่ทางใดก็ทางหนึ่ง เนื่องจาก zipgrep เป็นเพียง shellscript, การคลายซิปและ egrep เองคุณอาจทำได้ด้วยตนเอง:

for file in *.zip; do unzip -c "$file" | grep "ORA-1680"; done

หากคุณต้องการเพียงรายการไฟล์ซิปที่ตรงกันคุณสามารถใช้สิ่งต่อไปนี้:

for file in *.zip; do
    if ( unzip -c "$file" | grep -q "ORA-1680"); then
        echo "$file"
    fi
done

วิธีนี้คุณจะคลายการบีบอัดไปยัง stdout เท่านั้น (เช่นไปยังหน่วยความจำ) แทนที่จะทำการคลายการบีบอัดไฟล์ลงดิสก์ แน่นอนคุณสามารถลองเฉพาะgrep -aไฟล์ zip แต่ขึ้นอยู่กับเนื้อหาของไฟล์และรูปแบบของคุณคุณอาจได้รับผลบวกปลอมและ / หรือเชิงลบที่ผิด


ตัวเลือกแรกจะเปิดเครื่องรูดไฟล์ที่ใด
ziggy

2
unzip -cขยายขนาดไฟล์เป็น stdout มันไม่ได้เขียนไฟล์ที่ไม่มีการบีบอัดทั้งหมดไว้ที่อื่น
โนอาห์

+1 มันช่วยประหยัดวันของฉันได้มาก ฉันแค่เพิ่ม echo "$ file"; unzip -c "$ file" | grep -q "ORA-1680"; เพื่อทราบชื่อไฟล์ + ผลลัพธ์
ไมค์

2
รุ่นของฉันที่unzipใช้-pสำหรับการสตรีมไปที่ pipe!
gavenkoa

สิ่งนี้ใช้ได้ผลที่คำสั่งบรรทัดเดียวทั้งหมดส่งคืน "เอาต์พุตมาตรฐาน" ไม่ใช่ชื่อไฟล์ +1
alimack

16

zipgrepใช้ไฟล์เดียว ในการทำให้มันทำงานกับไฟล์หลาย ๆ ไฟล์

for i in *.zip
do
   zipgrep ORA-1680 "$i"
done

2
ในหนึ่งบรรทัดที่พิมพ์ชื่อไฟล์ zip หากมีการแข่งขัน:for i in *.zip; do zipgrep TextToSearch $i && echo $i; done
baptx

4

AVFSระบบแฟ้มนำเสนอมุมมองของระบบแฟ้มที่ทุกไฟล์เก็บถาวรสามารถเข้าถึงได้เป็นไดเรกทอรี/path/to/foo.zip ~/.avfs/path/to/foo.zip#เป็นระบบไฟล์FUSEที่คุณสามารถติดตั้งบน Solaris ได้ AVFS จัดให้มีการเข้าถึงรูปแบบไฟล์เก็บถาวรทั่วไปแบบอ่านอย่างเดียว

mountavfs
for z in ~/.avfs$PWD/*.zip; do
  find "$z#" -exec grep ORA-1680 {} +
done
fusermount -u ~/.avfs   # optional
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.