bash函数grep --exclude-dir不能正常工作

时间:2013-11-13 19:28:11

标签: bash grep find

我的.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;
}

2 个答案:

答案 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参数。