【问题标题】:Unix zipping sub directory not including parent directoryUnix 压缩子目录不包括父目录
【发布时间】:2011-12-31 18:40:01
【问题描述】:

我想压缩一个子目录并将其发送到其他地方,我遇到的问题是,当我使用 zip 命令时,它还包括我不想要的所有不需要的目录层。

例如

zip -r /new.zip /Unwanted1/Unwanted2/wanted1/wanted2/file.txt

###unzipped produces the following
/Unwanted1/Unwanted2/wanted1/wanted2/file.txt

###I want
/wanted1/wanted2/file.txt

更新:我要压缩的目录有很多嵌套目录,因此 -r.处理绝对路径也很好,旧的解决方案是用来 cd 关于这个地方的,但我只是不太喜欢它。也许这是最好的(唯一的)方式。

【问题讨论】:

  • -r 表示递归。如果您真的需要使用它,那么您应该阅读排除的 zip 选项。如果您只想压缩一个文件,请 cd 到相应的父目录(根据您的示例)./Unwanted1/Unwanted2 然后zip new.zip wanted/file.txt。也就是说,我认为没有 zip 选项意味着“丢弃输入文件名的前 n 层子目录信息”。祝你好运。
  • 您已经编辑了您的示例,这极大地改变了游戏。人们通常不想要这样的绝对路径。 “zip”中可能有更多路径修剪/控制选项,但我对此表示怀疑。阅读手册页。或者切换到“tar”并阅读那个(同样长的)手册页。而且,如果要添加单个文件,无论多深,您仍然不需要 -r。

标签: unix terminal zip


【解决方案1】:

您必须将目录更改为您想要开始的任何位置,或者可以选择“压缩”来为您完成此操作。如果您懒得阅读手册页中的大量选项,就像我一样,请先“cd”,即使在脚本中也是如此。或者您可以将整个内容括在括号中,而不会影响您的 shell 或脚本的工作目录:

(cd Unwanted1/Unwanted2; zip -r ~/new.zip ./wanted/file.txt)

或者由于您使用的是 -r,您可能想要的不仅仅是 file.txt,所以:

(cd Unwanted1/Unwanted2; zip -r ~/new.zip wanted)

或者使用pushd/popd跳入/跳出:

pushd Unwanted1/Unwanted2
zip -r ~/new.zip wanted
popd

这适用于 sh/bash/csh/tcsh。

【讨论】:

    【解决方案2】:

    一种简单的方法可能是做

    cd ./Unwanted1/Unwanted2
    zip -r ../../new.zip ./wanted/file.txt
    

    但我不知道你的情况如何。也许您需要从基本目录运行?当您想要递归遍历目录时,还使用“-r”选项 - 您提供的示例是使用一个文件。

    【讨论】:

    • 谢谢其实是多个目录和文件,例子是v.simple
    • 是的,就像 icarus 和 sehe 所说,如果您将命令括在括号中,它不会在执行完成后弄乱您当前的工作目录。
    【解决方案3】:

    最简单,惯用的方式:

    (cd ./Unwanted1/Unwanted2 && zip -r ../../new.zip ./wanted/file.txt)
    

    现在 zip、tar、rar、cpio 和朋友都有选项来管理相同的内容,但它们可能因版本而异,当然也因存档实用程序而异。我建议你学习使用 shell 来完成这项工作,你可以使用任何你想要的存档格式

    另一种方式:

    (cd ./Unwanted1/Unwanted2 && find . -name "*.txt" -print) | zip new.zip -@
    

    【讨论】:

    • 尽管我更喜欢 zip 中的标志/选项来省略父文件夹结构,但似乎没有更好的方法。 -j-D 两个标志都没有在复杂的子文件夹结构上做我们想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 2012-12-02
    相关资源
    最近更新 更多