web-dev-qa-db-ja.com

単一のコマンドでUNIXファイルシステムにJARを抽出し、JARコマンドを使用してそのターゲットディレクトリを指定するにはどうすればよいですか?

Pythonスクリプトを作成しています。このスクリプト内でUNIXシステムコマンドを実行しています。Portal.earというearアーカイブ内にBinaries.warというwarアーカイブがあります。

ポータルearファイルは、たとえば/ home/foo/bar /にあります

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

/home/foo/bar/Portal.earアーカイブからBinaries.warファイルを、スクリプトを実行している現在のディレクトリに抽出します。

1つのコマンドだけを使用して、抽出するターゲットディレクトリを指定するにはどうすればよいですか? Binaries.warをディレクトリ/ home/foo/bar/bazに抽出するには、このようなことをしたいと思います

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

JARのmanページでオプションを検索しましたが、これを行う簡単な方法が見つかりません。もちろん、アーカイブを現在のディレクトリに抽出し、mvを使用して移動できますが、ディレクトリとファイルをシャッフルするのではなく、ワンショットでこれを実行したいと思います。

45

示されているように、jarファイルにすでに絶対パス名がある場合、特に簡単です。

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

つまり、シェルをPythonディレクトリを変更して実行してから、抽出を実行します。

Jarファイルに絶対パス名がまだない場合は、jarがディレクトリの変更後にそれを見つけることができるように、相対名を絶対パス名に変換する必要があります(現在のディレクトリのパスをプレフィックスとして付けることによって) 。

心配しなければならない唯一の問題は、パス名の空白などです。

63

私はjarツールがこれをネイティブにサポートするとは思わないが、「unzip」でJARファイルを解凍し、「-d」オプションで出力ディレクトリを指定するだけでよい。

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

これが配布を計画しているスクリプトではなく、個人用スクリプトである場合、このためのシェル関数を記述する方が簡単かもしれません。

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

その後、pythonのように呼び出すことができます:

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

本当にそう感じたら、sedを使用してパスからファイル名を解析し、次のように呼び出すことができます。

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

ただし、これは読者への演習として残しておきます。

もちろん、これにより.warが最初に現在のディレクトリに抽出されてから移動されるため、現在の場所と同じ名前の何かを上書きする可能性があります。

ディレクトリを変更し、展開し、CDを戻すのは少し簡単ですが、コードの混乱を減らしたい場合は、このような小さな1行のシェル関数を常に使用しています。

1
Xiong Chiamiov

os.chdir(target) を使用してpythonスクリプト内の作業ディレクトリを変更することはできませんか? 、jarコマンド自体からそれを行う方法がわかりません。

ディレクトリを恒久的に変更したくない場合は、現在のディレクトリを(os.getcwd()を使用して)変数に保存し、後で元に戻します。

1
Nick Fortescue