我正在 Ruby on Rails 应用程序中搜索 OSX 上使用的单词grep
,并且我想排除与特定模式匹配的目录。
我正在使用以下命令:
grep -inRw -E 'direct' . --exclude-dir -E 'git|log|asset'
该命令没有执行我想象的操作。我是这样的想法它会起作用:
- 我- 不区分大小写的搜索
- n- 打印找到模式的行号
- 右- 递归搜索
- w- 我只想要整个单词 - 即匹配“direct”但不匹配“directory”
- -E- 使用扩展正则表达式
- '直接的'- 我要匹配的正则表达式
- 。- 在当前目录中搜索
- --exclude-dir -E 'git|log|asset'- 排除与 git 或 log 或 asset 匹配的目录。
就排除目录而言,该命令最终仍然在'./git'和'。/日志'目录以及'./应用程序/资产'
我显然缺乏一项基本知识,但我不知道它是什么。
答案1
它的模式如下球体不是像这样的模式正则表达式。根据info
页:
--排除-dir=GLOB
跳过名称后缀与模式 GLOB 匹配的任何命令行目录。递归搜索时,跳过基本名称与 GLOB 匹配的任何子目录。忽略 GLOB 中任何多余的尾部斜杠。
所以,您要么多次使用该开关或者,如果您的 shell 支持大括号扩展,您可以将其缩短并让 shell 扩展模式列表,例如:
grep -inRw -E 'direct' . --exclude-dir={git,log,assets}
排除名为git
,log
和assets
或 例如的目录
grep -inRw -E 'direct' . --exclude-dir={\*git,asset\*}
排除git
以 . 结尾或开头的目录名称asset
。
请注意,只有当存在时,shell 才会展开列表大括号内至少有两个目录名/全局变量。
答案2
--exclude-dir
不明白|
。
但是,您可以通过指定多次来获得相同的效果--exclude-dir
,每个要排除的目录一次:
grep -inRw -E --exclude-dir 'asset' --exclude-dir 'git' --exclude-dir 'log' 'direct'
答案3
这就是我做错的事情:输入的--exclude-dir
是目录名而不是路径名。目录名称不能包含/
.
以下作品:
grep -r --exclude-dir={cache,lib} pattern /home/ /var/
以下不起作用:
grep -r --exclude-dir={/var/cache,/var/lib} pattern /home/ /var/
答案4
请使用这个:
grep -inRw -E 'direct' folder/ --exclude-dir={\*git\*,\*log\*,\*assets\*}
或当前文件夹
grep -inRw -E 'direct' . --exclude-dir -E 'git|log|asset'