我在.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不工作的人有帮助- 它对我有用.)
做一个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参数.
| 归档时间: |
|
| 查看次数: |
5055 次 |
| 最近记录: |