web-dev-qa-db-fra.com

Eviter les chemins indésirables dans les fichiers Zip

Je suis en train de créer un script shell pour conditionner certains fichiers. Je suis en train de zipper un répertoire comme ça:

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

Le problème est que l’archive out.Zip résultante contient l’ensemble du chemin du fichier. C'est-à-dire que, une fois décompressé, il contiendra le chemin "/ Utilisateurs/moi/développement/autre-chose /". Est-il possible d'éviter ces chemins profonds lors de la mise en place d'un répertoire dans une archive?

Lorsque je lance Zip depuis le répertoire cible, je n'ai pas ce problème.

Zip -r out.Zip ./folder/

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

FWIW, j'utilise bash sur Mac OS X 10.6.

45
jerwood

Votre script doit utiliser cd ou pushd et popd pour se déplacer dans le répertoire qui sera la racine de l'archive avant que n'exécute la commande Zip. La procédure à suivre dépend de la manière dont le script sait quoi compresser. Mais, si vous voulez /Utilisateurs/moi/développement/quelque chose/dossier compressé avec des chemins d'accès internes de ./ dossier , vous devez faire ceci:

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

Cela se traduira par votre out.Zip contenant les chemins relatifs que vous souhaitez.

Si vous avez besoin d’aide pour la création de scripts, vous devez nous montrer votre script.

79
quack quixote

Le problème est que l’archive out.Zip résultante contient l’ensemble du chemin du fichier.
...
Est-il possible d'éviter ces chemins profonds lors de la mise en place d'un répertoire dans une archive?

Oui. Utilisez l'option -j avec Zip. -j est "indésirable le chemin". Selon la page de manuel sur Zip :

Stockez uniquement le nom d'un fichier enregistré (le chemin du fichier indésirable) et ne stockez pas les noms de répertoire. Par défaut, Zip stockera le chemin complet (par rapport au répertoire actuel).

Utiliser -j signifie la commande suivante:

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

Va créer une archive qui ressemble à:

myarchive.Zip
    |
    +-- file1.txt
    +-- file2.txt
    +-- file3.txt
    +-- file4.txt
3
jww