首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态创建的'zip‘命令(不排除目录)

动态创建的'zip‘命令(不排除目录)
EN

Stack Overflow用户
提问于 2015-11-23 19:38:03
回答 1查看 47关注 0票数 1

我是一个实用程序的作者,它使使用zip压缩项目变得更容易,特别是当您必须定期压缩时,例如更新提交到应用程序存储的项目(比如Chrome)。

我试图做一些改进,但遇到了一个问题,如下所述。

快速概述

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

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

The Issue

然而,我遇到了目录排除的问题,但我不太明白为什么(这可能是因为我仍然是个新手)。我将介绍一些例子:

假设我想忽略项目目录中的两件事:.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存储库的项目。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-23 20:07:38

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

因此,正如评论部分所说,我认为你已经找到了正确的解决方案。之所以会发生这种情况,是因为如果直接运行该变量,可以直接展开全局( globs )之类的东西,而不是传递给命令。争论可能会搞砸,这取决于具体情况。

是的,在这种情况下:

代码语言:javascript
复制
eval $COMMAND

是该走的路。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33879205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档