我有以下bash脚本
CMD="\( -path ./.git -o -name .gitignore \) -prune -o";
find . $CMD -print
find . $CMD -exec chmod 440 {} \+
我需要列出除.git dir和.gitignore文件之外的所有文件,而不是chmod它们。
答案 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)
您可以使用find
和dotglob
来代替使用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。