एकाधिक ज़िप फ़ाइलों पर एक स्ट्रिंग के लिए खोज


22

मैं SunOS 5.10 पर काम कर रहा हूं। मेरे पास एक फ़ोल्डर है जिसमें लगभग 200 ज़िप फाइलें हैं। प्रत्येक ज़िप फ़ाइल में केवल एक पाठ फ़ाइल होती है। मैं सभी ज़िप फ़ाइलों में सभी पाठ फ़ाइलों में एक विशिष्ट स्ट्रिंग की खोज करना चाहता हूं।

मैंने यह कोशिश की (जो ज़िप फ़ाइल में किसी भी टेक्स्ट फ़ाइल को खोजता है जिसमें स्ट्रिंग "ORA-" है) लेकिन यह काम नहीं किया।

zipgrep ORA-1680 *.zip

ज़िप फ़ाइलों को अनलॉक्ड किए बिना इसे करने का क्या सही है?


यह भी देखें कि मैं संकुचित अभिलेखागार के माध्यम से पुनरावृत्ति कैसे कर सकता हूं? (एक सटीक डुप्लिकेट नहीं, क्योंकि वहां की आवश्यकताएं अधिक जटिल थीं)।
गाइल्स का SO- बुराई पर रोक '17

जवाबों:


26

सामान्य तौर पर यह संभव नहीं है कि वह एक संपीड़ित फ़ाइल के भीतर सामग्री को खोजे बिना उसे एक तरह से या किसी अन्य तरीके से अनफॉलो कर सके। चूँकि zipgrep केवल एक शेलस्क्रिप्ट है, जो स्वयं unzip और 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ज़िप फ़ाइलों की कोशिश कर सकते हैं लेकिन फ़ाइल और आपके पैटर्न की सामग्री के आधार पर, आपको झूठी सकारात्मक और / या गलत नकारात्मक मिल सकती हैं।


पहला विकल्प फाइलों को अनज़िप करने के लिए कहाँ होगा?
ziggy

2
unzip -cफ़ाइल को stdout में हटाता है। यह पूरी तरह से असम्पीडित फ़ाइल कहीं और नहीं लिखता है।
नूह

+1 यह मेरे दिन को बचाने के लिए बहुत कुछ करता है। मैं जस्ट इको "$ फ़ाइल" जोड़ता हूं; अनज़िप -c "$ फ़ाइल" | grep -q "ORA-1680"; फ़ाइल का नाम + परिणाम जानने के लिए।
माइक

2
पाइप के लिए स्ट्रीमिंग के लिए unzipउपयोग का मेरा संस्करण -p!
गवेंको

यह काम करता है जहां सभी सिंगल लाइन कमांड "मानक आउटपुट" लौटाते हैं, फ़ाइल नाम +1 नहीं
alimack

16

zipgrepएक एकल फ़ाइल लेता है। कई फाइलों में काम करने के लिए इसे एक लूप में रखें:

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

2
एक पंक्ति में जो जिप फाइल नाम भी for i in *.zip; do zipgrep TextToSearch $i && echo $i; done
छापते हैं

4

AVFS फाइल सिस्टम प्रस्तुत फाइल सिस्टम जहां हर संग्रह फ़ाइल के एक दृश्य के /path/to/foo.zipएक निर्देशिका के रूप में पहुँचा जा सकता है ~/.avfs/path/to/foo.zip#। यह एक FUSE फाइल सिस्टम है, जिसे आप सोलारिस पर स्थापित कर सकते हैं। AVFS सबसे आम संग्रह फ़ाइल स्वरूपों में केवल पढ़ने के लिए पहुँच प्रदान करता है।

mountavfs
for z in ~/.avfs$PWD/*.zip; do
  find "$z#" -exec grep ORA-1680 {} +
done
fusermount -u ~/.avfs   # optional
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.