创建不记录根路径的zip压缩文件; 以编程方式实现

5
假设我想要压缩这个目录 〔c:/Users/xah/ErgoEmacs_Source/ergoemacs/build-util/〕
并且我希望输出目录为 〔c:/Users/xah/xx2/〕
(我的当前目录可以是任何地方。我在一个elisp程序中调用zip) 那么我需要执行以下命令:
zip -r c:/Users/xah/xx2/build-util.zip c:/Users/xah/ErgoEmacs_Source/ergoemacs/build-util/

然后zip将会记录完整路径,就像这样。
adding: Users/xah/ErgoEmacs_Source/ergoemacs/build-util/ (stored 0%)
adding: Users/xah/ErgoEmacs_Source/ergoemacs/build-util/.svn/ (stored 0%)
adding: Users/xah/ErgoEmacs_Source/ergoemacs/build-util/.svn/all-wcprops (deflated 56%)
...

我希望路径只需以build-util开头。
注:我正在一个程序(elisp)中调用zip,并且不能或不想使用任何环境变量的概念。
这是否可以通过一些zip参数来实现?

1
据我所知,zip没有像tar那样的-C选项,因此在执行之前需要更改当前目录。 - tokland
嗯……cd c:/Users/xah/ErgoEmacs_Source/ergoemacs; zip …,这是相对路径,这符合您的需求吗?可能要使用Elisp语言实现? - ajreal
谢谢。我认为tokland已经回答了这个问题。我的问题在于我不想先进入该目录。 - Xah Lee
1
哦...把它替换成tar,然后用z选项压缩? - ajreal
我会选择 @ajreal 的第一个建议 - 如果你不想使用 cd 来回切换目录,可以使用 pushd/popd :) - porges
显示剩余2条评论
2个回答

4

我最喜欢的bash函数之一是pushd,它可以保存你当前所在的目录并将你移动到指定的目录。相反的函数是popd,它可以将你移回到pushd之前所在的目录。

例如,你可以这样使用:

pushd c:/Users/xah/ErgoEmacs_Source/ergoemacs
zip -r c:/Users/xah/xx2/build-util.zip build-util/
popd

我认为你最终会得到你想要的结果。

4
奇怪的是,你最好的选择可能是使用Java JDK中的jar工具。
jar -cMf c:/Users/xah/xx2/build-util.zip -C c:/Users/xah/ErgoEmacs_Source/ergoemacs/build-util/ .
"-M"选项告诉jar不要创建清单文件,"-C"选项告诉它在开始压缩文件之前先更改目录。我参考的文档在这里:http://download.oracle.com/javase/tutorial/deployment/jar/build.html

顺便说一下,Java的jar归档文件只是带有一些清单信息的zip文件。 - Tim Perry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接