Crear archivo zip e ignorar la estructura de directorios

217

Necesito crear un archivo zip con este comando:

zip /dir/to/file/newZip /data/to/zip/data.txt

Esto funciona, pero el archivo zip creado crea una estructura de directorio que imita el directorio al archivo sin formato. Es una gran cantidad de carpetas adicionales que no necesito.

No encontré una respuesta en una mirada superficial sobre la página de manual o una búsqueda de Google.

Jake
fuente
2
Estaba pensando que esta pregunta era anterior a todos esos otros intercambios de pila, pero, por desgracia, la publicación del superusuario en realidad es anterior a esta. Si hay algo que pueda hacer aquí para ayudar, hágamelo saber. Esta debe ser una buena respuesta, ya que Google todavía genera mucho tráfico aquí. : D
Jake

Respuestas:

352

Puedes usar -j.

-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).
Lars Kotthoff
fuente
19
Si -jno funciona para su directorio (junto con -r)
revise
a veces simplemente no funciona ... prefiero el enlace @czerasz;) que básicamente es un combo popd pushd
TecHunter
36

Usar -jno funcionará junto con la -ropción.
Entonces, la solución para esto puede ser esto:

cd path/to/parent/dir/;
zip -r complete/path/to/name.zip ./* ;
cd -;

O versión en línea

cd path/to/parent/dir/ && zip -r complete/path/to/name.zip ./* && cd -

puede dirigir la salida a /dev/nullsi no desea que la cd -salida aparezca en la pantalla

Vikas Tawniya
fuente
En realidad, es posible que desee hacer lo siguiente:cd path/to/parent/dir/ && zip -r ../../../../name.zip ./* && cd -
eddyP23
@ eddyP23 ¿Cómo hace alguna diferencia? Más bien te hará agregar no. de parentDir (..) para cada directorio en la ruta: |
Vikas Tawniya
El resultado es el mismo, estoy de acuerdo. Pero en los scripts automatizados que se ejecutan en muchos entornos diferentes, generalmente evita rutas globales, porque no tiene idea de cuál será la ruta global. Pero a partir del cd path/to/parent/dir/puede calcular ../fácilmente el número de puntos dobles .
eddyP23
@ eddyP23 tiene sentido
Vikas Tawniya
33

Usa la -jopción:

   -j     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 path).
Dan D.
fuente
3

Alternativamente, puede crear un enlace simbólico temporal a su archivo:

ln -s /data/to/zip/data.txt data.txt
zip /dir/to/file/newZip !$
rm !$

Esto también funciona para un directorio.

MirkoBanchi
fuente
1

Retenga el directorio principal para unzip que no arroje archivos a todas partes

Al comprimir directorios, mantener el directorio padre en el archivo ayudará a evitar ensuciar su directorio actual cuando luego descomprima el archivo

Entonces, para evitar retener todas las rutas, y dado que no puede usar -j y -r juntos (obtendrá un error), puede hacer esto en su lugar:

cd path/to/parent/dir/;
zip -r ../my.zip ../$(basename $PWD)
cd -;

El ../$(basename $PWD)es la magia que retiene el directorio padre.

Entonces ahora unzip my.ziple dará una carpeta que contiene todos sus archivos:

parent-directory
├── file1
├── file2
├── dir1
│   ├── file3
│   ├── file4

En lugar de ensuciar el directorio actual con los archivos descomprimidos:

file1
file2
dir1
├── file3
├── file4
AndrewD
fuente
0

Simplemente use la -jrmopción para eliminar las estructuras de archivos y directorios

zip -jrm /path/to/file.zip /path/to/file
Qader Dorosti
fuente
tenga cuidado, -m --move Mueve los archivos especificados al archivo zip; en realidad, esto elimina los directorios / archivos de destino después de hacer el archivo zip especificado. Si un directorio se vacía después de eliminar los archivos, el directorio también se elimina. No se realizan eliminaciones hasta que zip haya creado el archivo sin error. Esto es útil para conservar espacio en disco, pero es potencialmente peligroso, por lo que se recomienda usarlo en combinación con -T para probar el archivo antes de eliminar todos los archivos de entrada.
catalint