在MacOS上找到GNU

在MacOS上找到GNU,macos,find,Macos,Find,我已经用自制软件下载了GNU版的find: brew install findutils --with-default-names 当我在find上运行which时,我得到了我想要的: $ which find /usr/local/bin/find 但是,当我使用find时,系统会返回到OS X默认值/usr/bin/find,即: $ find -exec file {} \; find: illegal option -- e usage: find [-H | -L | -P] [-

我已经用自制软件下载了GNU版的
find

brew install findutils --with-default-names
当我在
find
上运行
which
时,我得到了我想要的:

$ which find
/usr/local/bin/find
但是,当我使用
find
时,系统会返回到OS X默认值
/usr/bin/find
,即:

$ find -exec file {} \;
find: illegal option -- e
usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
       find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]

$ /usr/local/bin/find -exec file {} \;
.: directory

为什么会发生这种情况?我如何才能使
查找
正常工作?

解决方案再简单不过了:


一个简单的系统重启。

只需启动一个新的终端。重新启动系统是一种过激行为。

请注意,默认名称的
--已被禁用。现在必须按照安装时的指示,将二进制文件显式添加到路径中

我不喜欢更改操作系统--我不知道,但是其他一些实用程序可能依赖操作系统附带的find命令,这可能会导致以后的问题。所以我要做的是在.bashrc中创建一个别名。因此,brew安装findutils时,将在.bashrc put alias find='/usr/local/bin/gfind'中放置一个/usr/local/bin/gfind,每次键入find时,它将使用/usr/local/bin/gfind中的gfind。激活所需的全部操作就是source.bashrc。或者只是开始一个新的终端。不需要重新启动。我使用了很多gnu实用程序来实现这一点,并使其易于撤消,只需删除别名即可。

brew
自发布此问题以来发生了变化。以前接受的答案是不正确的-不足以让任何人遵循(重新启动不是答案)-但现在
brew
和路径的包装也发生了变化。为了保持这一页的相关性,这里有一个新的答案

这显示MacOS提供的find,默认为system$路径:

$ which find
/usr/bin/find
这将安装GNU查找:

$ brew install findutils
虽然它已经安装,但它不会接触mac版本,也不会采用默认路径。这是为了防止意外。您可以停在这里,不进行任何额外的配置,但要以GNU版本为目标,您的脚本需要指定可执行文件的完整路径

现在,将GNU设为默认(路径中的第一个),这意味着只要一个普通的
find
命令调用它,您就需要将GNU find的目录“放在第一个”在您的路径中。在我的例子中,在
$HOME/.bash\u profile
中管理$PATH,但在某些系统上可能是
$HOME/.bashrc

PATH=$(brew --prefix)/opt/findutils/libexec/gnubin:$PATH
^^您的默认路径变量前面可能已经有其他内容。您可以将此逐字添加为新行,也可以小心地插入字符串(包括
$
,并使用
与下一个值分开)

在每个打开的shell窗口中,重新加载环境:

$ source ~/.bash_profile
或者,关闭所有终端窗口。新的终端窗口将具有更新的路径变量。不要重新启动

现在检查您的
查找

$ which find
/usr/local/opt/findutils/libexec/gnubin/find
万岁,GNU是默认的
find
。但我们没有破坏操作系统默认查找功能——它仍然存在,因此任何特定于macOS的脚本都会找到它:

$ ls /usr/bin/find
/usr/bin/find
如果您遇到任何非Apple、macOS脚本,它们严重假设“find”是BSD类型(Apple版本),但您首先在搜索路径中安装了GNU find,那么您将遇到与Brew的兼容性问题。因为BSD“find”有GNU“find”没有的选项,反之亦然。很少有脚本假定您使用BSD find,但如果遇到这种情况:只需在该脚本顶部添加一行,将alias
find
添加到正确的脚本,或者您可以操纵
$PATH
,以便
find
转到正确安装的命令实例,或者,如果这些听起来都不容易,您可以编辑脚本,以便
find
命令的所有实例都包含正确版本的完全限定路径。但很少有人需要这段文字。:-)


请注意,
——默认名称的功能已被删除(但令人困惑的是,brew网站仍建议使用此选项)。对于任何现代Brew安装,尝试使用默认名称的
——只会显示一条错误消息。情况发生了变化,不幸的是,Brew网站总是严重过时,原因不明,

Bash会缓存路径。使用
hash-r
将其清除。
请参见检查您的$PATH。osx默认版本可能位于$PATH中比gnu版本更早出现的目录中。e、 g.
path=/bin/usr/local/bin
,如果您在这两个版本中都找到了,那么它将运行
/bin
版本first@MarcB但是在这种情况下,
哪个
不应该返回
/usr/bin/find
?我刚刚检查了$PATH和
…:/usr/local/bin:/usr/bin:/bin:
,因此默认值不早。您不需要重新启动系统。它已经安装,所以他只需要刷新PATH变量。他可以做
source~/.bash_profile
路径中没有添加任何内容。见对问题的评论。此外,您的解决方案意味着我使用的是Bash,而不是。您使用的是哪个shell?您的shell可能有一个等效的命令。您是否检查了终端新实例的路径,或在运行
brew安装
命令之前打开的路径?“哪个shell”是无关的干扰。对于任何shell,“重新启动”都不是正确答案。这个问题在谷歌排名很高,很多OSX用户希望GNU版本的
find
优先于苹果提供的BSD版本。如果这些访问者看到这个被接受的答案,这对他们没有帮助。