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?

Dami
fuente

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;
zzbomb
fuente
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).
robrtsql
fuente
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 ..
aluc
fuente
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.

Kenneth
fuente
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