Supprimer un seul fichier de l'archive zip sous Linux

75

J'ai une archive zip (créée automatiquement dans un script avec des -j -rdrapeaux) et j'aimerais supprimer un seul fichier de celle-ci. J'ai essayé comme documenté.

zip -d "picture_43_9.jpg" gallery.zip

mais je reçois cette erreur:

zip warning: picture_43_9.jpg not found or empty   
zip error: Nothing to do! (picture_43_9.jpg)  

Quoi qu’il en soit, il existe un tel fichier dans l’archive et il n’est pas vide:

unzip -l .../gallery.zip | grep -i 43_9.jpg  
1477092  2013-05-22 14:23   picture_43_9.jpg 

Des idées sur ce que je fais mal?

Alex Flo
la source

Réponses:

103

Vous avez les arguments échangés. Essaye ça:

zip -d gallery.zip "picture_43_9.jpg" 

Depuis la page de manuel zip (1) :

-d
--delete
Supprimer (supprimer) des entrées d'une archive zip. Par exemple:

zip  -d  foo  foo/tom/junk  foo/harry/\*  \*.o

supprime l'entrée foo/tom/junk, tous les fichiers qui commencent par foo/harry/et tous les fichiers qui se terminent par .o(dans n'importe quel chemin). Notez que l'extension du chemin d'accès au shell a été inhibée avec des barres obliques inverses afin que zip puisse voir les astérisques, permettant ainsi à zip de correspondre au contenu de l' archive zip au lieu du contenu du répertoire en cours. (Les barres obliques inverses ne sont pas utilisées sur les plates-formes MSDOS.) Peut également utiliser des guillemets pour échapper aux astérisques comme dans

zip -d foo foo/tom/junk "foo/harry/*" "*.o"

Si vous n'échappez pas aux astérisques sur un système où le shell développe des caractères génériques, les astérisques sont convertis en une liste de fichiers dans le répertoire en cours et cette liste est utilisée pour supprimer des entrées de l'archive.

Sous MSDOS, -d est sensible à la casse lorsqu'il correspond aux noms figurant dans l' archive zip . Cela nécessite que les noms de fichiers soient entrés en majuscules s'ils ont été compressés par PKZIP sur un système MSDOS. (Nous avons envisagé de rendre cette casse non sensible aux systèmes où les chemins d'accès étaient insensibles, mais il est possible que l'archive provienne d'un système où la casse est importante et que l'archive pourrait inclure les deux Baret en bar tant que fichiers séparés dans l'archive.) Mais voyez la nouvelle option - ic pour ignorer la casse dans l'archive.

Jaypal Singh
la source
Tu as raison, merci, j'ai été dérouté par l'aide en ligne de commande de zip zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
Alex Flo
@ AlexFlo: Vous avez peut-être une mauvaise copie de la page de manuel. La copie citée ci-dessus indique “[ zipfile [ fichier… ]]”, ce qui signifie que vous pouvez n'avoir aucun argument de nom de fichier (bien que je ne sache pas comment cela peut être valide, sauf lorsque vous demandez de l'aide ), (b) un nom de fichier zip (fichier d’archive) uniquement, ou (c) un nom de fichier zip suivi d’ un ou de plusieurs noms de fichiers ordinaires. (Il peut s'agir des noms des fichiers à insérer dans l'archive ou des noms des membres de l'archive à manipuler.)
Scott
@AlexFlo - Vous pouvez transmettre des arguments de nom de fichier via STDIN et le rediriger vers zip, comme indiqué dans la page de manuel que vous avez citée. Par exemple, si vous êtes dans un répertoire contenant file1.txt, file2.txtet file3.txt, vous pouvez exécuter ls -1 | zip -q 'files.zip' -@, ce qui créera l’archive files.zipcontenant les 3 fichiers que vous avez dirigés zipavec leur nom de fichier intact.
rubynorails