You have the arguments swapped. Try this:
zip -d gallery.zip "picture_43_9.jpg"
From the zip(1) man page:
-d
--delete
Remove (delete) entries from a zip archive. For example:
zip -d foo foo/tom/junk foo/harry/\* \*.o
will remove the entry foo/tom/junk
, all of the files that start with
foo/harry/
, and all of the files that end with .o
(in any path). Note
that shell pathname expansion has been inhibited with backslashes, so
that zip can see the asterisks, enabling zip to match on the contents
of the zip archive instead of the contents of the current directory.
(The backslashes are not used on MSDOS-based platforms.) Can also use
quotes to escape the asterisks as in
zip -d foo foo/tom/junk "foo/harry/*" "*.o"
Not escaping the asterisks on a system where the shell expands
wildcards could result in the asterisks being converted to a list of
files in the current directory and that list used to delete entries
from the archive.
Under MSDOS, -d is case sensitive when it matches
names in the zip archive. This requires that file names be entered in
upper case if they were zipped by PKZIP on an MSDOS system. (We
considered making this case insensitive on systems where paths were
case insensitive, but it is possible the archive came from a system
where case does matter and the archive could include both Bar
and bar
as separate files in the archive.) But see the new option -ic to
ignore case in the archive.