9

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

2 回答 2

16

指定要排除的目录时,请确保不要包含尾部斜杠。例如:

做这个:

$ grep -r --exclude-dir=node_modules firebase .

不是这个:

$ grep -r --exclude-dir=node_modules/ firebase .

(此答案不适用于 OP,但可能对其他发现--exclude-dir不工作的人有所帮助——它对我有用。)

于 2016-03-25T19:52:47.800 回答
8

在你的系统上做一个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.*文件后,将结果传递给在-exec该文件上执行 grep 命令的子句。

有些人喜欢这样:

$ 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参数。

于 2013-11-13T22:08:49.453 回答