假设结构:
/foo/bar/
--file1
--file2
--file3
--folder1
--file4
--folder2
--file5
我想运行unix zip实用程序,从bar
文件夹压缩foo
文件夹及其所有文件和子文件夹,但没有bar
文件夹在zip中,只使用命令行。
如果我尝试使用-j
参数,它不会根据需要在zip中创建bar文件夹,但不会创建folder1
和folder2
。执行-rj
不起作用。
(我知道我可以进入内部栏并做zip -r bar.zip .
我想知道是否有可能完成$ / foo / bar / zip -r bar.zip .
,但是从$ / foo完成。
答案 0 :(得分:8)
您必须cd /foo/bar
然后zip -r bar.zip .
,但是,您可以将它们与括号分组以在子shell中运行:
# instead of: cd /foo/bar; zip -r bar.zip; cd -
( cd /foo/bar; zip -r bar.zip . )
附带的(paren-grouped)命令在子shell中运行,其中的cd不会影响外壳会话。
请参阅sh manual。
Compound Commands
A compound command is one of the following:
(list) list is executed in a subshell environment (see COMMAND EXECUTION ENVIRONMENT below).
Variable assignments and builtin commands that affect the shell's environment do not remain in effect after the command completes.
The return status is the exit status of list.
答案 1 :(得分:6)
zip没有像tar那样的-C(更改目录)命令
你可以这样做:
cd folder1 && zip -r ../bar.zip *
来自命令行shell
或者您可以使用bsdtar,它是libarchive中可以创建zip的tar版本
bsdtar cf bar.zip --format zip -C folder1。
(这会创建一个名为./的文件夹 - 不确定解决方法)
答案 2 :(得分:2)
我无法代表OP的推理。我也在寻找这个解决方案。
我正在编写一个程序,通过构建内部xml文件并将它们压缩在一起来创建.ods
。它们必须位于存档的根目录中,否则当您尝试运行OOo时会出现错误。
我确信还有其他方法可以做到这一点:
在名为.ods
的OOo中创建一个空白blank.ods
文件,提取到名为blank
的目录,然后尝试运行:
cd blank && zip -r ../blank.ods *
我写的方式,shell在一个命令后关闭,所以如果你只是在命令行中添加&& cd ..
,我就不需要导航回原始目录:
cd blank && zip -r ../blank.ods * && cd ..