Eliminar un solo archivo del archivo zip en Linux

75

Tengo un archivo zip (creado automáticamente en un script con -j -rbanderas) y me gustaría eliminar un solo archivo. Lo intenté según lo documentado.

zip -d "picture_43_9.jpg" gallery.zip

pero me sale este error:

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

De todos modos, no es un archivo de este tipo dentro del archivo y no está vacío:

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

¿Alguna idea sobre lo que estoy haciendo mal?

Alex Flo
fuente

Respuestas:

103

Tienes los argumentos intercambiados. Prueba esto:

zip -d gallery.zip "picture_43_9.jpg" 

Desde la página del comando man zip (1) :

-d
--delete
Eliminar (eliminar) entradas de un archivo zip. Por ejemplo:

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

eliminará la entrada foo/tom/junk, todos los archivos que comienzan con foo/harry/y todos los archivos que terminan con .o(en cualquier ruta). Tenga en cuenta que la expansión del nombre de ruta del shell se ha inhibido con barras diagonales inversas, de modo que zip puede ver los asteriscos, lo que permite que zip coincida con el contenido del archivo zip en lugar del contenido del directorio actual. (Las barras invertidas no se usan en plataformas basadas en MSDOS). También se pueden usar comillas para escapar de los asteriscos como en

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

No escapar de los asteriscos en un sistema donde el shell expande comodines podría resultar en que los asteriscos se conviertan en una lista de archivos en el directorio actual y esa lista se use para eliminar entradas del archivo.

En MSDOS, -d distingue entre mayúsculas y minúsculas cuando coincide con los nombres en el archivo zip . Esto requiere que los nombres de los archivos se ingresen en mayúsculas si PKZIP los comprimió en un sistema MSDOS. (Consideramos hacer que este caso sea insensible en los sistemas donde las rutas no distinguen entre mayúsculas y minúsculas, pero es posible que el archivo provenga de un sistema en el que el caso sí importa y el archivo podría incluir ambos Bary bar como archivos separados en el archivo). Pero vea la nueva opción : ic para ignorar mayúsculas y minúsculas en el archivo.

jaypal singh
fuente
Tienes razón, gracias, me confundió la ayuda de la línea de comandos de zip zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
Alex Flo
@ AlexFlo: Es posible que tenga una copia incorrecta de la página de manual. La copia citada arriba dice "[ archivo zip [ archivo ... ]]", lo que significa que puede tener (a) ningún argumento de nombre de archivo (aunque no sé cómo puede ser válido, aparte de cuando está pidiendo ayuda ), (b) solo un nombre de archivo zip (archivo de almacenamiento), o (c) un nombre de archivo zip seguido de uno o más nombres de archivo ordinarios. (Estos pueden ser los nombres de los archivos reales que se insertarán en el archivo o los nombres de los miembros del archivo que se manipularán.)
Scott,
@AlexFlo: puede pasar argumentos de nombre de archivo a través de STDIN y canalizarlos zip, como se indica en la página de manual que citó. Por ejemplo, si está en un directorio que contiene file1.txt, file2.txty file3.txt, puede ejecutar ls -1 | zip -q 'files.zip' -@, lo que creará el archivo que files.zipcontiene los 3 archivos a los que está conectado zipcon sus nombres de archivo intactos.
rubynorails