Java 如何使用单个命令提取UNIX文件系统中的JAR,并使用JAR命令指定其目标目录?

Java 如何使用单个命令提取UNIX文件系统中的JAR,并使用JAR命令指定其目标目录?,java,python,linux,unix,jar,Java,Python,Linux,Unix,Jar,我正在创建一个Python脚本,在其中执行UNIX系统命令。我有一个 名为Binaries.war的war存档,位于名为Portal.ear的ear存档中 门户ear文件位于,例如/home/foo/bar中/ jar xf /home/foo/bar/Portal.ear Binaries.war 将从/home/foo/bar/Portal.ear归档文件中提取Binaries.war文件到运行脚本的当前目录中 如何仅使用一个命令指定要提取到的目标目录? 我想这样做,将Binaries.w

我正在创建一个Python脚本,在其中执行UNIX系统命令。我有一个 名为Binaries.war的war存档,位于名为Portal.ear的ear存档中

门户ear文件位于,例如/home/foo/bar中/

jar xf /home/foo/bar/Portal.ear Binaries.war
将从/home/foo/bar/Portal.ear归档文件中提取Binaries.war文件到运行脚本的当前目录中

如何仅使用一个命令指定要提取到的目标目录? 我想这样做,将Binaries.war解压缩到/home/foo/bar/baz目录中

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

我在JAR手册页上搜索了一些选项,但似乎找不到一个简单的方法。当然,我可以将归档文件解压缩到我当前的目录中,然后使用mv将其移动,但我希望一次性完成,而不是随意移动目录和文件。

我认为jar工具本机不支持这一点,但您可以使用“unzip”解压jar文件,并使用“-d”选项指定输出目录,比如:

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

您不能使用更改python脚本中的工作目录吗?我同意,从jar命令本身看不到任何方法


如果不想永久更改目录,请将当前目录(使用
os.getcwd()
)存储在一个变量中,然后再更改回原来的目录。

如果您的jar文件已具有如图所示的绝对路径名,则特别容易:

cd /where/you/want/it; jar xf /path/to/jarfile.jar
也就是说,您可以让Python change directory为您执行shell,然后运行提取

如果您的jar文件还没有绝对路径名,那么您必须将相对名称转换为绝对名称(在其前面加上当前目录的路径),以便
jar
可以在目录更改后找到它


唯一需要担心的问题是路径名中的空格。

如果这是一个个人脚本,而不是您计划分发的脚本,那么为它编写一个shell函数可能更简单:

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回显都有点干净,但我发现自己在想减少代码混乱时一直在使用这样的小单行shell函数。

是的--.jar只是带有不同扩展名的.zip。当缺少“jar”工具时,有很多处理拉链的工具,它们可以在阳光下做任何事情(哈哈,糟糕的双关语)。这会起作用,但是Portal.ear文件太大,需要花费太长时间。我只想从Portal.ear中提取Binaries.war归档文件。必须有一种方法可以使用解压来实现这一点。$man unzip!!我已经修改了这个问题,只包括Binaries.war文件。我确认这种方法比我以前见过的更简单。实际上,jar是一种实现文件,这就是实现它的方法。如果目录不存在,也可以先创建它。在“cd”命令之前运行“mkdir-p/where/You/want/it”-是的,当然可以这样做。如果有人担心,这个
jar xf
方法会保持原始jar不变。此函数首先提取到当前目录,然后移动到目标。因此,只能在您拥有写入权限的目录中使用它,这是一种失望。有没有办法告诉
jar
直接提取到目的地?
jar
应该支持提取时的
-C
(更改目录)选项,但在我的机器上不支持(我觉得很奇怪)。因此,我今天可能会将函数重写为类似于
函数warextract{pushd“$3”和&jarxf“$1”“$2”;popd}
。好的,添加
--帮助
文档:另外,
basename
dirname
是比
sed
更好的目录/文件拆分选项。在bash中,我不得不这样编写这个函数(注意括号):函数warextract(){jarxf$1$2&&mv$2$3},你应该;只有帕伦斯是最安全的选择。