我正在寻找一种通过解析包含一系列zsh
通配模式的文件来构建文件列表的方法。
最终目标是将这个文件列表传递给 hg add
mercurial。对于那些对此特定部分感兴趣的人,我的问题是由我在 StackOverflow 中提出的另一个问题引发的:
示例文件(我们称之为.hginclude
)如下所示:
.zshrc
.zprofile
.less*
.emacs*/**
src*/**
.hg*
.bash*
.inputrc
.ssh
脚本的输出应该是文件通过收集输出获得
print globbing_pattern
在每一行上,whereglobbing_pattern
指的是上面文件中的每一行.hginclude
。
最终,文件列表应该是一个我可以传递到hg add
Mercurial 中跟踪这些文件的列表。
这部分的假设是我有.hgignore
以下内容:
syntax: glob
*
这意味着:除非通过命令明确添加,否则不要跟踪任何内容hg add
。
答案1
看hg 帮助模式。 Mercurial 支持从文件中读取文件名,因此您可以执行以下操作
$ hg add listfile:myfiles.txt
并myfiles.txt
包含要添加的文件名。对您来说更有趣的是 Mercurial 中的“文件名”可以是 glob 模式。所以你可以myfiles.txt
包含
.zshrc
.zprofile
glob:.less*
glob:.emacs*/**
等等,hg add
上面的命令会做正确的事情。
你甚至可以使用文件集选择文件。这是一种find
类似的语言,可以让你做类似的事情
set:exec() and not binary()
选择非二进制的可执行文件,即脚本。
上面的命令将要尊重该.hgignore
文件,因此您不能直接使用它们来解决您的问题。但是,您可以使用
$ hg status --all --no-status listfile:myfiles.txt
获取按模式匹配的文件列表,包括通常会被忽略的任何文件。然后您可以继续使用此文件列表hg add
:
$ hg status -A -n -0 listfile:myfiles.txt | xargs -0 hg add
答案2
尝试这个:
hg add `for i in `cat myfiles.txt` ; do ls $i ; done`
其中 myfiles.txt 包含 glob。但当然 initpc 的建议更干净。