Regex 动态创建';拉链';命令未正确排除目录
我是一个实用程序的作者,它使使用Regex 动态创建';拉链';命令未正确排除目录,regex,linux,shell,sh,Regex,Linux,Shell,Sh,我是一个实用程序的作者,它使使用zip压缩项目变得更容易,特别是当您必须定期压缩时,例如更新提交到应用程序商店(如Chrome的Web商店)的项目 我试图做一些改进,但遇到了一个问题,如下所述 快速概述 我的实用程序的命令格式类似于命令选项DEST DIR1{DIR2 DIR3 DIR4…}。它通过运行zip-r DEST.zip DIR1来工作;一个相当简单的过程。然而,我的实用程序的好处是能够使用预先确定的文件(想想.gitignore)忽略特定的文件/目录,或者与模式匹配的文件/目录 这很
zip
压缩项目变得更容易,特别是当您必须定期压缩时,例如更新提交到应用程序商店(如Chrome的Web商店)的项目
我试图做一些改进,但遇到了一个问题,如下所述
快速概述我的实用程序的命令格式类似于
命令选项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
添加排除项
问题
然而,我遇到了一个目录排除的问题,我不太明白为什么(这可能是因为我还是sh新手)。我将介绍一些示例:
假设我想忽略项目目录中的两件事:.git/*
和.gitignore
。运行command foo.zip project\u dir
生成以下命令:
zip-r foo.zip project-x project/.git/\*-x project/.gitignore
呜呼!成功!好。。。不完全是
在本例中,.gitignore
未添加到压缩输出文件foo.zip
。目录.git/*
及其所有子目录(和文件)将添加到压缩输出文件中
手动运行命令:
zip-r foo.zip project\u 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
特性——我在上述示例中使用的.git/*
和.gitignore
只是一个示例;我的工具不依赖于git,也不专门用于git存储库项目
我怀疑问题出在对生成的命令的评估上,因为您说直接执行同一个命令是正确的
因此,正如评论部分所说,我认为您已经找到了正确的解决方案。发生这种情况是因为如果直接运行该变量,可以直接展开globs之类的内容,而不是传递给命令。而争论可能会混乱,这取决于具体情况
是的,在这种情况下:
eval $COMMAND
就是要做的。我怀疑问题可能出在对生成的命令的评估上,因为您说过直接执行同一命令是正确的
因此,正如评论部分所说,我认为您已经找到了正确的解决方案。发生这种情况是因为如果直接运行该变量,可以直接展开globs之类的内容,而不是传递给命令。而争论可能会混乱,这取决于具体情况
是的,在这种情况下:
eval $COMMAND
方法是这样的。您如何运行生成的命令?这是关键部分,未显示。另外,我也很感谢你抽出时间来讲述整个故事,但下一次请直接讨论问题。问题需要简洁直接。@sidyll,该命令存储在变量命令中,然后使用$command
执行(我也使用了${command}
)。您为我指出了正确的方向,并使用eval$命令
按预期工作。如果你想写一个答案,我可以把它标记为正确。谢谢你重新开始这个问题。这并不是因为观点,但留给未来可能遇到类似问题的观众可能会很有用。这是本网站背后的伟大意图,维护解决方案数据库。最美好的祝愿Benjamin这正是我留下有力描述的原因;)——尽管在大多数情况下,直截了当和简洁绝对是可取的!再次感谢,继续摇滚!如何运行生成的命令?这是关键部分,未显示。另外,我也很感谢你抽出时间来讲述整个故事,但下一次请直接讨论问题。问题需要简洁直接。@sidyll,该命令存储在变量命令中,然后使用$command
执行(我也使用了${command}
)。您为我指出了正确的方向,并使用eval$命令
按预期工作。如果你想写一个答案,我可以把它标记为正确。谢谢你重新开始这个问题。这并不是因为观点,但留给未来可能遇到类似问题的观众可能会很有用。这是本网站背后的伟大意图,维护解决方案数据库。祝本杰明一切顺利