I once needed something similar to find class files in a bunch of zip files. Here it is:
#!/bin/bash
function process() {
while read line; do
if [[ "$line" =~ ^Archive:\s*(.*) ]] ; then
ar="${BASH_REMATCH[1]}"
#echo "$ar"
else
if [[ "$line" =~ \s*([^ ]*abc\.jpg)$ ]] ; then
echo "${ar}: ${BASH_REMATCH[1]}"
fi
fi
done
}
find . -iname '*.zip' -exec unzip -l '{}' \; | process
Now you only need to add one line to extract the files and maybe move them. I'm not sure exactly what you want to do, so I'll leave that to you.
Use Python's zipfile library?
~/wrk/tmp$ ls test.zip
ls: cannot access test.zip: No such file or directory
Ok. There is no 'test.zip' right now...
~/wrk/tmp$ python -c 'import zipfile,sys ; zipfile.ZipFile(sys.argv[1],"a").write(sys.a
rgv[2],sys.argv[3])' test.zip /etc/motd text/motd
Let's add '/etc/motd' as 'text/motd' to the nonexisting zipfile...
~/wrk/tmp$ ls -l test.zip
-rw-r--r-- 1 yeti yeti 473 Mar 23 09:51 test.zip
The zipfile library was nice enough to create 'test.zip'.
~/wrk/tmp$ unzip -lv test.zip
Archive: test.zip
Length Method Size Cmpr Date Time CRC-32 Name
-------- ------ ------- ---- ---------- ----- -------- ----
357 Stored 357 0% 2014-03-20 15:47 ff1b8b7f text/motd
-------- ------- --- -------
357 357 0% 1 file
..and it seems to contain what I wated...
Let's check it by unzipping it to stdout...
~/wrk/tmp$ unzip -p test.zip text/motd
Linux aurora 3.2.0-0.bpo.4-amd64 #1 SMP Debian 3.2.54-2~bpo60+1 x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Fine!
Now we add a 2nd file...
~/wrk/tmp$ python -c 'import zipfile,sys ; zipfile.ZipFile(sys.argv[1],"a").write(sys.argv[2],sys.argv[3])' test.zip /etc/issue otherdir/issue
~/wrk/tmp$ ls -l test.zip
-rw-r--r-- 1 yeti yeti 605 Mar 23 09:52 test.zip
(yeti@aurora:1)~/wrk/tmp$ unzip -lv test.zip
Archive: test.zip
Length Method Size Cmpr Date Time CRC-32 Name
-------- ------ ------- ---- ---------- ----- -------- ----
357 Stored 357 0% 2014-03-20 15:47 ff1b8b7f text/motd
28 Stored 28 0% 2012-09-21 22:52 f9c3990c otherdir/issue
-------- ------- --- -------
385 385 0% 2 files
~/wrk/tmp$ unzip -p test.zip otherdir/issue Debian GNU/Linux 6.0 \n \l
~/wrk/tmp$ _
Best Answer
You asked if it's possible: yes, this is possible if you mount the zip as a filesystem (or, of course, if you unzip the archive, which I'm assuming you're explicitly not willing to do from Some Good Reason).
See Fuse-Zip for a tool that will do this. You could then do something like:
Note that this is going to requires fuse, which in-turn requires a kernel module that you may or may not have. But you asked if it was possible, not if it was convenient.