Comprime un archivo sin incluir el directorio padre


30

Quiero comprimir muchas carpetas en un árbol de directorios así

V-
 something.txt
 folder
 folder
 g.jpg
 h.jar

Cuando trato de comprimirlo, termina creando un archivo zip con la carpeta v en lugar de su contenido (los subdirectorios y archivos)

¿Cómo puedo evitar esto?

Respuestas:


23

Entonces, si entiendo correctamente, está tratando de archivar los archivos y carpetas en una carpeta en particular pero sin incluir la carpeta raíz.

Ejemplo:

/test/test.txt
/test/test2.txt

donde test.txt y test2.txt se almacenarían en el archivo zip, pero no / test /

Puede cd en el directorio / test / luego ejecutar algo como,

zip -r filename.zip ./*

Lo que crearía un archivo en la misma carpeta llamada filename.zip. O si lo ejecuta desde fuera de la carpeta que podría ejecutar,

zip -r test.zip test/*

El / * es la parte que incluye solo el contenido de la carpeta, en lugar de toda la carpeta.

Editar: OP quería múltiples cremalleras, la solución terminó siendo un poco pirata, tengo curiosidad por saber si hay una mejor manera de hacerlo.

for d in */ ; do base=$(basename "$d") ; cd $base ; zip -r $base * ; mv "${base}.zip" .. ; cd .. ; done;

Sí, pero tengo una gran cantidad de archivos que voy a hacer lo mismo en lo que sería tedioso hacerlo así también lo es que hay como una escritura del golpe o algo que permitiera automatizar el mismo proceso en el directorio que tiene todas las carpetas
— Dami

1
Ok, ejecuté el script y creó un directorio padre en el archivo. Solo quiero que el contenido de la carpeta esté en el archivo
— Dami

1
mi error, me perdí un poco agregó un parámetro -j que acabo de buscar, aparentemente omite la parte que no desea. intente esto:for d in */ ; do base=$(basename "$d") ; zip -rj "${base}.zip" "$d" ; done;
— zzbomb

18
zip -r test.zip test / * desde afuera agrega la prueba como directorio en el archivo zip
— smihael

44
como dijo @smihael, zip -r test.zip test/*no funciona. ¿Hay alguna forma correcta de lograr esto desde fuera del directorio?
— andrhamm

22

Use la opción -jo --junk-pathsen su comando zip.

Desde la página de manual de zip :

-j

--junk-paths

Store just the name of a saved file (junk the path), and do not store directory 
names. By default, zip will store the full path (relative to the current 
directory).

Esta parece ser la respuesta correcta.
— mutant_city

3
¿Qué pasa con las rutas / carpetas anidadas?
— GuyPaddock

3
Esto omitirá todas las carpetas en el archivo, y si tiene nombres de archivo duplicados en diferentes carpetas, esto explotará. Esto tiene su lugar, pero solo si no te interesan las carpetas y solo quieres archivos. No es lo que pedía el OP, pero sigue siendo un buen conocimiento
— Govind Rai

17

¿Qué tal este comando?

$ cd somedir ; zip -r ../zipped.zip . * ; cd ..

55
Si bien esta es una respuesta correcta, la introducción no parece que estés convencido. También ayudaría a explicar un poco lo que hace el comando.
— Nephente

1
Esta fue mi solución también, pero no me gusta porque implica cd. Esperaba que hubiera una manera de especificar la ruta almacenada con mayor precisión.
— nilskp

3

Espero que esto ayude.

(cd directory && zip -r ../out.zip .)

Mantiene el shell principal en el mismo directorio y solo cambia el directorio del sub-shell que muere después del comando.


Quería agregar esto como un comentario a la respuesta de @Alfred UC , pero no tengo suficiente reputación para eso.
— Kenneth

Si realmente resuelve el problema, entonces puede ser una solución.
— Yufenyuy Veyeh Dider

Esto es mejor como respuesta. ¿Funciona esto tanto en bash como en sh?
— Arlen Beiler
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.