Wie extrahieren Sie eine JAR in einem UNIX-Dateisystem mit einem einzigen Befehl und geben ihr Zielverzeichnis mit dem JAR-Befehl an?

Lesezeit: 4 Minuten

Benutzeravatar von Christopher Tokar
Christoph Tokar

Ich erstelle ein Python-Skript, in dem ich UNIX-Systembefehle ausführe. Ich habe ein Kriegsarchiv namens Binaries.war, das sich in einem Ohrarchiv namens Portal.ear befindet

Die Portal-ear-Datei befindet sich beispielsweise in /home/foo/bar/

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

Entpackt die Datei Binaries.war aus dem Archiv /home/foo/bar/Portal.ear in das aktuelle Verzeichnis, in dem ich das Skript ausführe.

Wie geben Sie mit nur einem Befehl ein Zielverzeichnis an, in das extrahiert werden soll? Ich möchte so etwas tun, um Binaries.war in das Verzeichnis /home/foo/bar/baz zu extrahieren

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

Ich habe die JAR-Manpage nach Optionen durchsucht und kann anscheinend keinen einfachen Weg finden, dies zu tun. Natürlich kann ich das Archiv in mein aktuelles Verzeichnis extrahieren und es dann mit mv verschieben, aber ich möchte dies auf einmal tun und Verzeichnisse und Dateien nicht herummischen.

Wenn Ihre JAR-Datei wie abgebildet bereits einen absoluten Pfadnamen hat, ist es besonders einfach:

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

Das heißt, Sie lassen die Shell von Python Change Directory für Sie ausführen und führen dann die Extraktion aus.

Wenn Ihre JAR-Datei noch keinen absoluten Pfadnamen hat, müssen Sie den relativen Namen in einen absoluten Namen umwandeln (indem Sie ihm den Pfad des aktuellen Verzeichnisses voranstellen), damit jar kann es nach dem Verzeichniswechsel finden.

Die einzigen Probleme, um die man sich noch kümmern muss, sind Dinge wie Leerzeichen in den Pfadnamen.

  • Dies ist der Weg, es zu tun. Sie können das Verzeichnis auch zuerst erstellen, falls es noch nicht existiert.

    – Nr

    3. Juli 2009 um 15:17 Uhr

  • Führen Sie “mkdir -p /where/you/want/it” vor dem Befehl ‘cd’ aus – ja, das könnten Sie sicherlich tun.

    – Jonathan Leffler

    3. Juli 2009 um 15:44 Uhr

  • Falls jemand von euch betroffen ist, dies jar xf Methode lässt das ursprüngliche Glas intakt.

    – Cale Sweeney

    11. April 2017 um 0:30 Uhr

Benutzeravatar von tddmonkey
tddmonkey

Ich glaube nicht, dass das jar-Tool dies nativ unterstützt, aber Sie können einfach eine JAR-Datei mit “unzip” entpacken und das Ausgabeverzeichnis damit mit der Option “-d” angeben, also so etwas wie:

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

  • Ja – .jars sind nur .zips mit einer anderen Erweiterung. Wenn “Jar”-Tools fehlen, gibt es viele Tools, die sich mit Reißverschlüssen befassen, die so ziemlich alles unter der Sonne tun können (ha ha, schlechtes Wortspiel).

    – zenazn

    3. Juli 2009 um 15:02 Uhr

  • Das würde funktionieren, aber die Portal.ear-Datei ist riesig und würde zu lange dauern. Ich möchte nur das Binaries.war-Archiv aus Portal.ear extrahieren. Es muss eine Möglichkeit geben, dies mit Unzip zu tun.

    – Christoph Tokar

    3. Juli 2009 um 15:36 Uhr

  • $ Mann entpacken !! Ich habe die Frage so geändert, dass sie nur die Binaries.war-Datei enthält

    – tddmonkey

    3. Juli 2009 um 15:56 Uhr

  • Ich bestätige, dass dieser Weg einfacher ist, als ich je gesehen habe. Tatsächlich ist jar eine Art Achievement-Datei.

    – Tung

    19. November 2015 um 10:59 Uhr

Können Sie nicht einfach das Arbeitsverzeichnis innerhalb des Python-Skripts mit ändern os.chdir(target)? Ich stimme zu, ich kann aus dem jar-Befehl selbst keine Möglichkeit erkennen, dies zu tun.

Wenn Sie das Verzeichnis nicht dauerhaft ändern möchten, speichern Sie das aktuelle Verzeichnis (mithilfe von os.getcwd()) in eine Variable und ändere sie danach wieder zurück.

Wenn dies ein persönliches Skript ist und nicht eines, das Sie verteilen möchten, ist es möglicherweise einfacher, eine Shell-Funktion dafür zu schreiben:

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

die Sie dann von Python aus so aufrufen könnten:

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

Wenn Sie wirklich Lust dazu haben, können Sie mit sed den Dateinamen aus dem Pfad herauslesen, damit Sie ihn damit aufrufen können

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

Das überlasse ich aber dem Leser als Übung.

Da dies die .war-Datei zuerst in das aktuelle Verzeichnis entpacken und dann verschieben wird, besteht natürlich die Möglichkeit, etwas mit demselben Namen dort zu überschreiben, wo Sie sich befinden.

Das Ändern des Verzeichnisses, das Extrahieren und Zurückcd-ing ist ein bisschen sauberer, aber ich finde mich immer wieder dabei, kleine einzeilige Shell-Funktionen wie diese zu verwenden, wenn ich Code-Unordnung reduzieren möchte.

1431080cookie-checkWie extrahieren Sie eine JAR in einem UNIX-Dateisystem mit einem einzigen Befehl und geben ihr Zielverzeichnis mit dem JAR-Befehl an?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy