【问题标题】:Dynamically-created 'zip' command not excluding directories properly动态创建的“zip”命令未正确排除目录
【发布时间】:2016-02-26 00:59:13
【问题描述】:

我是一个实用程序的作者,它使使用 zip 压缩项目变得更容易一些,尤其是当您必须定期压缩时,例如更新提交到应用商店(如 Chrome 的网上应用店)的项目。

我正在尝试进行很多改进,但遇到了一个问题,如下所述。

快速概览
我的实用程序的命令格式类似于command OPTIONS DEST DIR1 {DIR2 DIR3 DIR4...}。它通过运行zip -r DEST.zip DIR1 工作;一个相当简单的过程。然而,我的实用程序的好处是能够使用预定文件(想想.gitignore)来忽略特定文件/目录,或与模式匹配的文件/目录。

这很简单——如果“ignorefile”存在于目标目录(DIR1、DIR2、DIR3 等)中,我的实用程序将使用模式-x some_file-x some_dir/* 将排除项添加到zip -r DEST.zip DIR1 命令。

问题
但是,我遇到了目录排除问题,我不太明白为什么(这可能是因为我还是个新手)。我将通过一些示例:

假设我想忽略项目目录中的两件事:.git/*.gitignore。运行 command foo.zip project_dir 构建以下命令:

zip -r foo.zip project -x project/.git/\* -x project/.gitignore

哇哦!成功!嗯……不完全是。

在此示例中,.gitignore 未添加到压缩输出文件 foo.zip。目录.git/* 及其所有子目录(和文件)被添加到压缩输出文件中。


手动运行命令:

zip -r foo.zip project_dir -x project/.git/\* -x project/.gitignore

当然可以按预期工作,所以我很自然地很困惑为什么我的相同但动态构建的命令不起作用。

尝试的解决方案

我尝试了几种不同的方法来解决这个问题:

  • 从命令中删除-x project/.git/\*,而是在该目录中添加每个子目录和文件,例如-x project/.git/config -x project/.git/HEAD等(包括子目录的子目录)

  • 删除星号前的反斜杠,使命令中的排除选项为-x project/.git/*

  • 焦虑地敲击键盘(我真的很惊讶这不起作用,它通常会起作用)


一些注意事项

  • 我的实用程序使用/bin/sh;我宁愿保持这种方式以获得最大的兼容性。

  • 我知道git archive 功能——我在上面的例子中使用.git/*.gitignore 只是作为一个例子;我的实用程序不依赖于 git,也不专门用于作为 git 存储库的项目。

【问题讨论】:

  • 你是如何运行你生成的命令的?这是关键部分,没有显示。另外,我很感谢您花时间讲述完整的故事,但下次直接解决问题。问题需要简洁直接。
  • @sidyll,命令存储在变量COMMAND中,然后使用$COMMAND执行(我也使用过${COMMAND})。您为我指明了正确的方向,并且使用 eval $COMMAND 按预期工作。如果您想写一个答案,我可以将其标记为正确。
  • 感谢您重新提出问题。不是因为积分,而是留下它可能对可能遇到类似问题的未来观众有用。这是这个网站背后的伟大意图,维护一个解决方案的数据库。最好的祝愿本杰明
  • 这正是我留下强有力的描述的原因;)——尽管在大多数情况下直接和简洁绝对是更可取的!再次感谢,继续摇滚!

标签: regex linux shell sh


【解决方案1】:

我怀疑问题出在对生成的命令的评估中,因为您说直接执行时相同的命令是正确的。

正如评论部分所说,我认为您已经找到了正确的解决方案。发生这种情况是因为如果您直接运行该变量,则可以直接扩展诸如 glob 之类的东西,而不是传递给命令。根据情况,争论可能会搞砸。

是的,在这种情况下:

eval $COMMAND

是要走的路。

【讨论】:

    猜你喜欢
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多