Searching for a string on multiple zip files

  • I am working on SunOS 5.10. I have a folder that contains about 200 zip files. Each zip file contains only one text file in it. I would like to search for a specific string in all the text files in all the zip files.

    I tried this (which searches for any text file in the zip file that contains the string "ORA-") but it didn't work.

    zipgrep ORA-1680 *.zip
    

    What is the correct of doing it without uncompressing the zip files?

    See also How do I recursively grep through compressed archives? (not an exact duplicate, because the requirements there were more complicated).

  • Noah

    Noah Correct answer

    9 years ago

    It is in general not possible to search for content within a compressed file without uncompressing it one way or another. Since zipgrep is only a shellscript, wrapping unzip and egrep itself, you might just as well do it manually:

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

    If you need just the list of matching zip files, you can use something like:

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

    This way you are only decompressing to stdout (ie. to memory) instead of decompressing the files to disk. You can of course try to just grep -a the zip files but depending on the content of the file and your pattern, you might get false positives and/or false negatives.

    Where would the first option unzip the files to?

    `unzip -c` decompresses the file to stdout. It doesn't write the whole uncompressed file anywhere else.

    +1 tks a lot it save my day . I juste add echo "$file"; unzip -c "$file" | grep -q "ORA-1680"; to know the file name + the result.

    My version of `unzip` uses `-p` for streaming to pipe!

    This works where all the single line commands returned "standard output", not a file name +1

License under CC-BY-SA with attribution


Content dated before 6/26/2020 9:53 AM