60 votes

Éviter les chemins indésirables dans les fichiers Zip

Je fais un Shell Shell pour emballer certains fichiers. Je zippe un répertoire comme ceci :

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

Le problème est que l'archive out.zip qui en résulte contient le chemin d'accès complet au fichier. En d'autres termes, lorsqu'elle est décompressée, elle contient le chemin d'accès complet à "/Users/me/development/anotherthing/". Est-il possible d'éviter ces chemins profonds lorsque l'on place un répertoire dans une archive ?

Lorsque j'exécute zip depuis l'intérieur du répertoire cible, je n'ai pas ce problème.

zip -r out.zip ./folder/

Dans ce cas, je ne reçois pas toutes les ordures. Cependant, le script en question sera appelé de n'importe où.

Pour info, j'utilise bash sur Mac OS X 10.6.

107voto

user12786 Points 454

Votre script devrait utiliser cd o pushd y popd à déplacer dans le répertoire qui sera la racine de l'archive avant l'émission du zip commandement. La façon dont vous le faites exactement dépendra de la façon dont le script sait ce qu'il faut zipper. Mais, si vous voulez /Users/me/development/quelque chose/dossier zippé avec des chemins internes de seulement ./dossier vous devez faire ça :

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

Cela aura pour conséquence que votre out.zip contenant les chemins relatifs que vous voulez.

Si vous avez besoin d'aide pour écrire ce script, vous devrez nous montrer votre script.

10voto

jww Points 10948

Le problème est que l'archive out.zip qui en résulte contient le chemin d'accès complet au fichier.
...
Est-il possible d'éviter ces chemins profonds lors de la mise en archive d'un répertoire ?

Oui. Utilisez le -j option avec zip . -j est "junk the path". Selon le Page de manuel sur le zip :

Stocker seulement le nom d'un fichier sauvegardé (sans le chemin), et ne pas stocker noms de répertoire. Par défaut, zip stocke le chemin complet (relatif à le répertoire actuel).

使用方法 -j signifie la commande suivante :

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

Cela créera une archive qui ressemblera à :

myarchive.zip
    |
    +-- file1.txt
    +-- file2.txt
    +-- file3.txt
    +-- file4.txt

7voto

Igor Ostaptchenko Points 171

Il y a pushd y popd y $OLDPWD . En supposant que le $PWD es /Users/me/development faire :

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

Maintenant, le $PWD est de retour à /Users/me/development

2voto

AndrewD Points 453

Zip sans inclure les chemins, mais incluant le répertoire parent, et sans avoir à coder en dur son nom

Une version légèrement améliorée de la réponse acceptée de @quack.

Si vous faites cela dans un script et ne voulez pas avoir à coder en dur le répertoire parent, vous pouvez faire ceci :

pushd /Users/me/development/something/folder/;
zip -r ../out.zip ../$(basename $PWD)
popd;

En ../$(basename $PWD) permettra de s'assurer que les fichiers sont conservés dans le répertoire parent lors de l'extraction.

Alors maintenant unzip my.zip donnera un dossier contenant tous vos fichiers :

folder
 file1
 file2
 dir1
    file3
    file4

Au lieu d'encombrer le répertoire courant avec les fichiers décompressés :

file1
file2
dir1
 file3
 file4

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X