不包含压缩目录本身的Zip命令

5
假设有以下结构:
/foo/bar/
        --file1
        --file2
        --file3
        --folder1
          --file4
        --folder2
          --file5

我想运行Unix的zip实用程序,从foo文件夹压缩bar文件夹及其所有文件和子文件夹,但不将bar文件夹放在zip文件中,并仅使用命令行。如果我尝试使用-j参数,它不会像我想要的那样在zip文件中创建bar文件夹,但不会创建folder1folder2。使用-rj也不起作用。(我知道我可以进入bar并执行zip -r bar.zip .,但我想知道是否可能从$/foo执行$/foo/bar/zip -r bar.zip .来实现这一点)。
3个回答

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 . )

括号中的命令在子shell中运行,cd命令不会影响外部shell会话。

请参考sh手册

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.

6

zip命令没有像tar那样的-C(更改目录)命令。

你可以这样操作:

cd folder1 && zip -r ../bar.zip *

您可以在命令行shell中执行此操作。

或者,您可以使用bsdtar,它是从libarchive中提取的tar版本,可以创建zip文件。

bsdtar cf bar.zip --format zip -C folder1 .

(这将创建一个名为"./"的文件夹--不确定有没有避免这种情况的方法)

我需要学习更多关于命令行的知识,"cd folder1 && zip -r ../bar.zip *" 对我来说是一个不错的解决方案。谢谢! - Somebody still uses you MS-DOS
"bsdtar cf" 创建的是 tar 文件,而不是 zip。 - BCran
没错,我以为它会根据扩展名来推断,就像提取一样,但看来它不会。你需要添加一个 --format zip(而且似乎这并不总是有效)。 - Mark Harviston

2
我不能代表原帖作者的想法。我也在寻找这个解决方案。
我正在编写一个程序,通过构建内部xml文件并将它们压缩在一起来创建一个.ods文件。它们必须位于存档的根目录中,否则当您尝试运行OOo时会出现错误。
我相信还有其他几种方法可以实现这一点: 在OOo中创建一个名为blank.ods的空白文件,提取到名为blank的目录中,然后尝试运行:
cd blank && zip -r ../blank.ods *

我写的方式是,shell在执行完一个命令后就关闭了,所以我不需要回到原来的目录,如果你需要回到原来的目录,请在命令行中添加&& cd ..

cd blank && zip -r ../blank.ods * && cd ..

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