Problem :
I can search through a number of files for a particular string by pipelining ‘grep’ and ‘find’ commands.
Now, I have some 10 zip files each of which has archived a lot of text files. Is there any way I could search for a string in all text files archived in all those zip files without extracting the zip files?
Solution :
unzip -c *.zip | grep yourtext
You could use some regexes in the grep command to finetune the string matching
Based on the comments below, zgrep
would be a better option.
You can also use zipgrep command that is included with unzip package. For example:
for z in *.zip ; do zipgrep PATTERN $z |sed "s/^/$z: /" ; done
This command gives you matched file names inside the archives as well.
Mount the archives as directories using AVFS
or fuse-zip. Both are FUSE filesystems.
AVFS provides a view of the filesystem in ~/.avfs
where every archive file has an associated directory with the same name plus a #
at the end.
mountavfs
grep -r PATTERN ~/.avfs/$PWD/*.zip#/
…
unmountavfs
Fuse-zip mounts a zip onto a directory.
for z in *.zip; do mkdir "$z.d" && fuse-zip "$z" "$z.d"; done
grep -r PATTERN *.zip.z/
…
fusermount -u *.zip.d
rmdir *.zip.d