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

Noa*_*can 6 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;
}
Run Code Online (Sandbox Code Playgroud)

din*_*aur 14

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

做这个:

$ grep -r --exclude-dir=node_modules firebase .
Run Code Online (Sandbox Code Playgroud)

不是这个:

$ grep -r --exclude-dir=node_modules/ firebase .
Run Code Online (Sandbox Code Playgroud)

(这个答案不适用于OP,但可能对那些发现--exclude-dir不工作的人有帮助- 它对我有用.)

  • 绝对路径似乎也是禁忌.我是从root搜索并想避免`/ dev`,`/ proc`,`/ sys`等.`-- exclude-dir =/dev`不起作用而`--exclude-dir = dev`按预期工作. (3认同)
  • 这是因为--exclude-dir仅与基本名称匹配。这意味着引用嵌套文件夹也将不起作用,例如--exclude-dir = mydir / node_modules应该是--exclude-dir = node_modules。看到这里:https://superuser.com/a/1096219 (2认同)

Dav*_* W. 7

做一个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" \;
Run Code Online (Sandbox Code Playgroud)

我不是递归的粉丝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"
Run Code Online (Sandbox Code Playgroud)

-print0打印出所有被NULL字符分隔找到的文件.该xargs -0会在文件的该列表读取,并将其传递给grep命令.该-0通知xargs,文件名是NULL分离,而不是空格隔开.有些人xargs--null取代-0参数.