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

Posted

技术标签:

【中文标题】如何使用单个命令在 UNIX 文件系统中提取 JAR 并使用 JAR 命令指定其目标目录?【英文标题】:How do you extract a JAR in a UNIX filesystem with a single command and specify its target directory using the JAR command? 【发布时间】:2010-11-07 23:00:42 【问题描述】:

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

Portal 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 移动它,但我想一次性完成,而不是四处打乱目录和文件。

【问题讨论】:

【参考方案1】:

如果你的jar文件已经有如图所示的绝对路径名,那就特别简单了:

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

也就是说,你有由 Python 执行的 shell 为你更改目录,然后运行提取。

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

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

【讨论】:

这是实现它的方法。如果目录不存在,也可以先创建目录。 在 'cd' 命令之前运行 "mkdir -p /where/you/want/it" - 是的,你当然可以这样做。【参考方案2】:

我认为 jar 工具本身不支持此功能,但您可以使用“unzip”解压缩 JAR 文件,并使用“-d”选项指定输出目录,如下所示:

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

【讨论】:

是的——.jar 只是具有不同扩展名的 .zip。当缺少“jar”工具时,有很多工具可以处理几乎可以在阳光下做任何事情的拉链(哈哈,双关语) 这可行,但 Portal.ear 文件很大,需要很长时间。我只想从 Portal.ear 中提取 Binaries.war 存档。一定有办法使用解压缩来做到这一点。 $ 人解压!!我已将问题修改为仅包含 Binaries.war 文件 我确认这种方式比我见过的更简单。确实,jar 是一种实现文件。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

如果这是一个个人脚本,而不是您打算分发的脚本,那么为此编写一个 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-ing 后会更简洁一些,但我发现自己在想减少代码混乱时一直使用这样的小单行 shell 函数。

【讨论】:

这个函数首先解压到当前目录,然后移动到目的地。因此,只能在您具有写入权限的目录中使用它,这令人失望。有没有办法告诉jar直接解压到目的地? jar 应该在提取时支持-C(更改目录)选项,但它不在我的机器上(我觉得很奇怪)。因此,我今天可能会将函数重写为更像function warextract pushd "$3" && jar xf "$1" "$2" ; popd 的东西。好吧,添加--help 文档。 :) 另外,basenamedirname 是比 sed 更好的目录/文件拆分选项。你在四年内学到的东西。 在 bash 中,我不得不像这样编写这个函数(注意括号): function warextract () jar xf $1 $2 && mv $2 $3 你应该never use both function and (); just parens 是最安全的选择。

以上是关于如何使用单个命令在 UNIX 文件系统中提取 JAR 并使用 JAR 命令指定其目标目录?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 unix 命令行中提取 R major.minor 版本?

在单个命令中使用前缀重命名文件夹中的所有文件

删除类 UNIX 系统上的所有 SYSTEM V 共享内存和信号量

如何在unix脚本中提取文件名的一部分并检查它是不是存在[重复]

如何从bash中的ispell .mwl文件中提取所有前缀词

Ubuntu 18.04:无法使用单个命令提取下载的 tar.xz 文件