在 OSX 上使用 grep --exclude-dir

在 OSX 上使用 grep --exclude-dir

我正在尝试查找包含文本“默认交互式 shell”的文件。我正在尝试使用以下 grep 命令来查找它:

grep -r --exclude-dir='/{var,Volumes,bin,cores,dev,sbin,tmp,usr}' "The default interactive shell" /

但是它仍然进行搜索,/usr如以下错误消息所示:

grep: /usr/bin/sudo: Permission denied

如何执行递归 grep 并排除多个目录而不编写多个--exclude-dir选项?系统是OSX 10.15.4。

答案1

您正在排除具有文字名称 的目录/{var,Volumes,bin,cores,dev,sbin,tmp,usr}。这是由于单引号引起的。当大括号扩展被引用时,它就不再是大括号扩展,而只是普通文本。

要正确地让大括号展开,请删除引号:

grep -R --exclude-dir=/{var,Volumes,bin,cores,dev,sbin,tmp,usr} \
    -F 'The default interactive shell' /

我还添加了-F因为您使用字符串而不是正则表达式进行搜索。

答案2

我也在做同样的事情...

当我在 OSX Big Sur 中的 bash 终端启动时,它给出了这条消息......

“默认的交互式 shell 现在是 zsh。要更新您的帐户以使用 zsh,请运行chsh -s /bin/zsh。有关更多详细信息,请访问https://support.apple.com/kb/HT208050。”

因此,我进行了 grep 搜索,查找包含“默认交互式 shell”一词的文件。我没有找到这样的文件。

事实证明,消息“默认交互式 shell 等”实际上被硬编码到 bash 中。

hexdump -C /bin/bash 产生...

000775c0 6e 2f 7a 73 68 00 0a 54 68 65 20 64 65 66 61 75 |n/zsh..默认|

000775d0 6c 74 20 69 6e 74 65 72 61 63 74 69 76 65 20 73 |lt 交互式 |

000775e0 68 65 6c 6c 20 69 73 20 6e 6f 77 20 7a 73 68 2e |地狱现在是zsh。|

(注意:我的 $BASH_VERSION 是 3.2.57(1)-release)

(注意:有许多 ASCII 消息被硬编码到 bash 中。)

通过将以下行放入 ~/.bash_profile 导出中可以消除此警告 BASH_SILENCE_DEPRECATION_WARNING=1

伊恩·詹姆斯

相关内容