Perdona esta pregunta más básica, pero no pude encontrar una respuesta directa o un ejemplo simple en el intercambio de pila.
Digamos que tengo una carpeta de archivos que me gustaría comprimir en un archivo zip que puedo compartir con mis terribles amigos de Windows (de lo contrario, simplemente lo usaría tar
y terminaría). Se parece a esto:
.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
└── test.jpg
Suponiendo que haya zip
instalado:
sudo apt-get install zip
Veo man zip
que me permite usar una lista de archivos:
- @ listas de archivos. Si una lista de archivos se especifica como - @ [No en MacOS], zip toma la lista de archivos de entrada desde la entrada estándar en lugar de desde la línea de comandos. Por ejemplo,
zip -@ foo
Así que creé lo zip.lst
que se ve así:
cat zip.lst
file1.txt
file2.txt
file3.txt
file.jpg
test.jpg
Y ahora lo intenté:
zip -@ zip.lst
Pero no hizo nada excepto crear una línea en blanco en la consola. Y puedo seguir presionando Entery simplemente sigue haciendo más líneas en blanco sin aparentemente ejecutar el comando. Después de algunas búsquedas, me di cuenta de que necesitaba terminar la entrada presionando Ctrl+D
Pero ahora me sale este error:
zip warning: missing end signature--probably not a zip file (did you
zip warning: remember to use binary mode when you transferred it?)
zip warning: (if you are trying to read a damaged archive try -F)
zip error: Zip file structure invalid (zip.lst)
¿¡Qué!? ¿Cómo es que mi lista simple no es una "estructura de archivo válida"? Regreso al manual para más información, y miro más de cerca:
Si una lista de archivos se especifica como - @ ...
Así que lo intento sin -@
, y eso al menos lo procesa de inmediato sin tener que presionar Ctrl+, Dpero me queda el mismo error .
Afortunadamente, encontré un comentario sobre una respuesta a una pregunta casi no relacionada que me llevó a darme cuenta de que necesitaba nombrar explícitamente el archivo zip. Este error se debió a que, de forma predeterminada, intentaba crear un archivo zip llamado zip.lst
. Pero como ese es el nombre de mi lista, uno podría pensar que simplemente lo sobrescribiría, pero no, de hecho estaba tratando de actualizarlo. Y dado que la lista obviamente no es un archivo zip, obtenemos el error de estructura de archivo no válido, y ahora está claro por qué dice "probablemente no es un archivo zip". Entonces intenté:
zip files.zip zip.lst
adding: zip.lst (deflated 35%)
Eureka! Puedo ver que el archivo zip fue creado y mi carpeta ahora contiene esto:
.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
├── files.zip
├── test.jpg
└── zip.lst
Pero espere antes de celebrar, confirmemos primero el contenido del archivo zip:
unzip -l files.zip
Archive: files.zip
Length Date Time Name
--------- ---------- ----- ----
48 2016-05-24 15:30 zip.lst
--------- -------
48 1 file
¡No! Bueno, en realidad eso tiene sentido por el uso estándar porque simplemente comprimió el único archivo de lista que le di. Finalmente intenté nuevamente con -@
pero obtuve el mismo resultado.
¿Qué estoy haciendo mal?
Por cierto, sé que puedo usar la GUI y hacerlo con el mouse, pero necesito escribir esto, y en general soy más rápido en la CLI cuando sé lo que estoy haciendo.
ls
ygrep
y zip-@
, puede usar globos de shell para seleccionar archivos directamente en la línea de comando zip, por ejemplo,zip files.zip file*
ozip images.zip *.jpg
. Además, cuando use una lista de nombres de archivo de un archivo, puede usar la redirección en lugar de invocar un proceso cat separado,zip files.zip -@ < zip.lst