我的.bashrc中定义了以下函数,但由于某种原因--exclude-dir选项不排除.git目录。谁能看到我做错了什么?如果有帮助,我正在使用Ubuntu 13.10。
function fif # find in files
{
pattern=${1?" Usage: fif <word_pattern> [files pattern]"};
files=${2:+"-iname \"$2\""};
grep "$pattern" --color -n -H -s $(find . $files -type f) --exclude-dir=.git --exclude="*.min.*"
return 0;
}
答案 0 :(得分:13)
确保在指定要排除的目录时不要包含尾部斜杠。例如:
这样做:
$ grep -r --exclude-dir=node_modules firebase .
不是这个:
$ grep -r --exclude-dir=node_modules/ firebase .
(这个答案不适用于OP,但可能对那些发现--exclude-dir
不工作的人有帮助 - 它对我有用。)
答案 1 :(得分:6)
在您的系统上执行man grep
,然后查看您的版本。您的grep版本可能无法使用--exclude-dirs
。
您最好使用find
查找所需文件,然后使用grep
解析它们:
$ find . -name '.git' -type d -prune \
-o -name "*.min.*" -prune \
-o -type f -exec grep --color -n -H {} "$pattern" \;
我不是递归grep
的粉丝。它的语法变得臃肿,而且它真的没必要。我们有一个非常好的工具来查找符合特定条件的文件,谢谢。
在find
计划中,-o
将各种条款分开。如果文件尚未被先前的-prune
子句过滤掉,则会传递给下一个文件。一旦您删除了所有.git
目录和所有*.min.*
文件,就会将结果传递给在该文件上执行grep命令的-exec
子句。
有些人更喜欢这样:
$ find . -name '.git' -type d -prune \
-o -name "*.min.*" -prune \
-o -type f -print0 | xargs -0 grep --color -n -H "$pattern"
-print0
打印出由NULL字符分隔的所有找到的文件。 xargs -0
将读入该文件列表并将其传递给grep
命令。 -0
告诉xargs
文件名是NULL分隔而不是空格分隔。有些xargs
会使用--null
而不是-0
参数。