web-dev-qa-db-fra.com

Comment extraire un fichier JAR dans un système de fichiers UNIX avec une seule commande et spécifier son répertoire cible à l'aide de la commande JAR?

Je crée un script Python dans lequel j'exécute des commandes système UNIX. J'ai une archive war nommée Binaries.war qui se trouve dans une archive ear nommée Portal.ear

Le fichier oreille du portail réside dans, par exemple,/home/foo/bar /

jar xf /home/foo/bar/Portal.ear Binaries.war

Extrait le fichier Binaries.war de l’archive /home/foo/bar/Portal.ear dans le répertoire en cours d’exécution du script.

Comment spécifiez-vous un répertoire cible à extraire pour utiliser une seule commande? Je voudrais faire quelque chose comme ceci pour extraire Binaries.war dans le répertoire/home/foo/bar/baz

jar xf /home/foo/bar/Portal.ear Binaries.war [into target directory /home/foo/bar/baz]

J'ai effectué des recherches dans les options de la page de manuel JAR et je n'arrive pas à trouver un moyen simple de le faire. Bien sûr, je peux extraire l’archive dans mon répertoire actuel, puis la déplacer à l’aide de mv, mais j’aimerais le faire d’un seul coup, sans mélanger les répertoires et les fichiers.

45
Christopher Tokar

Si votre fichier jar a déjà un chemin d'accès absolu comme indiqué, c'est particulièrement simple:

cd /where/you/want/it; jar xf /path/to/jarfile.jar

C'est-à-dire que le shell est exécuté par Python change le répertoire pour vous, puis lancez l'extraction.

Si votre fichier jar n'a pas déjà un chemin absolu, vous devez convertir le nom relatif en absolu (en le préfixant avec le chemin du répertoire en cours) afin que jar puisse le trouver après le changement de répertoire. .

Les seuls problèmes qui restent à traiter sont des choses telles que des blancs dans les noms de chemins.

63
Jonathan Leffler

Je ne pense pas que l'outil jar prenne cela en charge de manière native, mais vous pouvez simplement décompresser un fichier JAR avec "unzip" et spécifier le répertoire de sortie avec cela avec l'option "-d".

$ unzip -d /home/foo/bar/baz /home/foo/bar/Portal.ear Binaries.war
58
tddmonkey

S'il s'agit d'un script personnel, plutôt que de celui que vous envisagez de distribuer, il pourrait être plus simple d'écrire une fonction Shell pour cela:

function warextract { jar xf $1 $2 && mv $2 $3 }

que vous pouvez ensuite appeler de python comme ceci:

warextract /home/foo/bar/Portal.ear Binaries.war /home/foo/bar/baz/

Si vous en avez vraiment envie, vous pouvez utiliser sed pour analyser le nom de fichier à partir du chemin, de manière à pouvoir l'appeler avec

warextract /home/foo/bar/Portal.ear /home/foo/bar/baz/Binaries.war

Je laisserai cela comme un exercice au lecteur, cependant.

Bien sûr, puisque ceci extraira d’abord le fichier .war dans le répertoire en cours, puis le déplacera, il est possible d’écraser quelque chose du même nom où vous vous trouvez.

Changer de répertoire, l'extraire et le cd-ing est un peu plus propre, mais je me retrouve à utiliser de petites fonctions de shell à une ligne comme celle-ci tout le temps lorsque je veux réduire l'encombrement du code.

1
Xiong Chiamiov

Ne pouvez-vous pas simplement changer le répertoire de travail dans le script python en utilisant os.chdir(target) =?? Je suis d’accord, je ne vois aucun moyen de le faire de la commande de pot elle-même.

Si vous ne souhaitez pas changer de répertoire de façon permanente, stockez le répertoire actuel (à l'aide de os.getcwd()) dans une variable, puis modifiez-le ultérieurement.

1
Nick Fortescue