![使用修改后的文件内容作为参数](https://linux22.com/image/56230/%E4%BD%BF%E7%94%A8%E4%BF%AE%E6%94%B9%E5%90%8E%E7%9A%84%E6%96%87%E4%BB%B6%E5%86%85%E5%AE%B9%E4%BD%9C%E4%B8%BA%E5%8F%82%E6%95%B0.png)
在脚本中,我想清除 Mercurial 存储库,但能够保留我从 $FILENAME 读取的许多(可配置)文件模式。 hg 命令的语法是
hg purge --all --exclude PATTERN1 --exclude PATTERN2 ...
因此,如果 $FILENAME 包含文件模式列表(每行一个模式),则每个模式必须在前面加上“--exclude”以构造命令行
我当前的方法是用于构建参数列表
grep -v -E "^[[:blank:]]*$" $FILENAME | sed "s/^/--exclude /g" | xargs echo
,该列表也会跳过空行以及仅包含制表符或空格的行,如果用于构建上述命令行,则会导致错误。因此总共:
hg purge --all `grep -v -E "^[[:blank:]]*$" $FILENAME | sed "s/^/--exclude /g" | xargs echo`
有没有更好的方法,也许有一些我不知道的 xargs 参数?
答案1
似乎 Mercurial 本身甚至有一种速记方式,利用文件列表(由 #mercurial 中的 mg 建议):
hg purge --all --exclude "listfile:$FILENAME"
答案2
我根本不明白你为什么要使用grep
and xargs
。给定一个这样的模式文件:
foo
bar
baz
你可以跑
$ echo hg purge --all $(perl -pe 's/^/--exclude /' file)
hg purge --all --exclude foo --exclude bar --exclude baz
甚至
$ echo hg purge --all $(sed 's/^/--exclude /' file)
hg purge --all --exclude foo --exclude bar --exclude baz
只需删除echo
即可实际运行命令。