Evite la ruta no deseada en el archivo Zip

49

Estoy haciendo un script de shell para empaquetar algunos archivos. Estoy comprimiendo un directorio como este:

zip -r /Users/me/development/something/out.zip /Users/me/development/something/folder/

El problema es que el archivo resultante out.zip tiene la ruta completa del archivo. Es decir, cuando se descomprime, tendrá toda la ruta "/ Users / me / development / anotherthing /". ¿Es posible evitar estas rutas profundas al colocar un directorio en un archivo?

Cuando ejecuto zip desde el directorio de destino, no tengo este problema.

zip -r out.zip ./folder/

En este caso, no consigo toda la basura. Sin embargo, el script en cuestión será llamado desde donde sea.

FWIW, estoy usando bash en Mac OS X 10.6.

jerwood
fuente

Respuestas:

85

Su script debe usar cdo pushdy popdpara moverse al directorio que será la raíz del archivo antes de emitir el zipcomando. Cómo lo hagas exactamente dependerá de cómo el script sepa qué comprimir. Pero, si quieres / Usuarios / Me / desarrollo / algo / carpeta comprimida con caminos internos de solo ./folder , que había necesidad de hacer esto:

pushd /Users/me/development/something
zip -r /path/to/out.zip ./folder/
popd

Eso dará como resultado que su out.zip contenga las rutas relativas que desea.

Si necesita ayuda con las secuencias de comandos, deberá mostrarnos su secuencia de comandos.

quijote curandero
fuente
8
No hay problema. Hago esto en una sola línea en la línea de comandos todo el tiempo, por ejemplo: $ pushd /some/path ; do-something ; popd... o incluso con subcapas:$ ( cd /some/path ; do-something )
quack quixote
1
@ ~ quack: +1 especialmente para la técnica de sub-shell en el comentario.
Jonathan Leffler
1
Aunque usar en &&lugar de ;es una buena idea para que el otro comando no se ejecute si cdfalla (error tipográfico u otro problema):(cd /some/path && do-something)
Chris Johnsen
3
¿No hay una manera de hacer esto sin especificar la ruta absoluta para el archivo zip?
orange80
2
¿Por qué estás jugando juegos con el camino? ¿Por qué no usar zip -j?
jww
5

El problema es que el archivo resultante out.zip tiene toda la ruta del archivo.
...
¿Es posible evitar estas rutas profundas al colocar un directorio en un archivo?

Sí. Use la -jopción con zip. -jes "basura el camino". Según la página del manual en zip :

Almacene solo el nombre de un archivo guardado (deseche la ruta) y no almacene los nombres de directorio. Por defecto, zip almacenará la ruta completa (relativa al directorio actual).

Usar -jsignifica el siguiente comando:

zip -j myarchive.zip file1.txt dir1/file2.txt dir2/dir3/file3.txt ../file4.txt

Creará un archivo similar a:

myarchive.zip
    |
    +-- file1.txt
    +-- file2.txt
    +-- file3.txt
    +-- file4.txt
jww
fuente
55
¿No es esto también basura todos los caminos, incluso aquellos en el directorio 'carpeta'? Creo que el OP solo quiere deshacerse de la ruta en la línea de comando.
Peter Jaric
1
Puede que esta no sea la respuesta a esta pregunta, pero es lo que necesito.
Aaron McMillin
1
Esta respuesta asume incorrectamente que el usuario quiere un zip plano. Esta es una suposición errónea y puede hacer que el script falle si dos archivos en diferentes subcarpetas tienen el mismo nombre.
Andrew Schwartz
1

Hay pushdy popdy $OLDPWD. Suponiendo que $PWDes /Users/me/developmentdo:

pushd something/folder
zip -r $OLDPWD/something/out.zip *
popd

Ahora el $PWDregreso a/Users/me/development

borodark
fuente