Eviter les chemins indésirables dans les fichiers Zip

49

Je suis en train de faire un script shell pour emballer 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 le chemin d'accès complet au fichier. C'est-à-dire que, une fois décompressé, il contiendra l'intégralité du 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 à partir du 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.

Jerwood
la source

Réponses:

85

Votre script doit utiliser cdou pushdet popdpour vous déplacer dans le répertoire qui sera la racine de l’archive avant d’ exécuter la zipcommande. La procédure à suivre dépendra de la manière dont le script sait quoi compresser. Mais si vous voulez / Utilisateurs / moi / développement / quelque chose / dossier compressé avec les chemins internes de seulement ./dossier , vous devez le faire:

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 voulez.

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

Quack Quack
la source
8
aucun problème. Je le fais tout le temps en ligne de commande, par exemple: $ pushd /some/path ; do-something ; popd... ou même avec des sous$ ( cd /some/path ; do-something )
coques
1
@ ~ quack: +1 spécialement pour la technique du sous-shell dans le commentaire.
Jonathan Leffler
1
Bien que l'utilisation &&au lieu de ;soit une bonne idée pour que l'autre commande ne s'exécute pas en cas d' cdéchec (faute de frappe ou autre problème):(cd /some/path && do-something)
Chris Johnsen
3
N'y a-t-il pas moyen de le faire sans spécifier le chemin absolu du fichier zip?
orange80
2
Pourquoi jouez-vous à des jeux avec le chemin? Pourquoi ne pas utiliser zip -j?
jww
5

Le problème est que l'archive out.zip résultante contient le chemin d'accès complet au 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' -joption avec zip. -jest "indésirable le chemin". Selon la page de manuel sur zip :

Stockez uniquement le nom d'un fichier enregistré (le fichier contenant le chemin 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 -jsignifie 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
jww
la source
5
Cela ne junk-t-il pas aussi tous les chemins, même ceux du répertoire 'folder'? Je pense que l'OP veut seulement se débarrasser du chemin sur la ligne de commande.
Peter Jaric le
1
Ce n'est peut-être pas la réponse à cette question, mais c'est ce dont j'ai besoin.
Aaron McMillin
1
Cette réponse suppose à tort que l'utilisateur souhaite un zip plat. Cette hypothèse est mauvaise et peut entraîner l'échec du script si deux fichiers de sous-dossiers différents portent le même nom.
Andrew Schwartz
1

Il y a pushdet popdet $OLDPWD. En supposant que le $PWDsoit /Users/me/developmentfait:

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

Maintenant le $PWDretour à/Users/me/development

Borodark
la source