如何将命令的一部分存储到变量中

时间:2014-08-21 18:53:56

标签: linux bash find

我有以下bash脚本

CMD="\( -path ./.git -o -name .gitignore \) -prune -o";

find . $CMD -print
find . $CMD -exec chmod 440 {} \+

我需要列出除.git dir和.gitignore文件之外的所有文件,而不是chmod它们。

3 个答案:

答案 0 :(得分:2)

除了reasons not to put code in variables之外,您实际上不应该两次运行find,尤其是当您可以在一个命令中合并-print-exec时。

答案 1 :(得分:2)

尽管有三分之一的问题,但使用数组进行编码的正确方法是:

find_opts=( \( -path ./.git -o -name .gitignore \) -prune -o )

find . "${find_opts[@]}" -print
find . "${find_opts[@]}" -exec chmod 440 {} \+

答案 2 :(得分:1)

您可以使用finddotglob来代替使用extglob

shopt -s dotglob extglob
for file in !(.git?(ignore)); do echo "$file" && chmod 440 "$file"; done

dotglob表示全局展开还包括以.开头的文件和extglob启用"扩展的globbing",它允许您否定匹配等等。在此示例中,glob匹配所有不是.git.gitignore的文件。

完成后取消设置这些选项,您可以使用shopt -u dotglob extglob

有关详细信息,请参阅http://mywiki.wooledge.org/glob