在MacOS上找到GNU
我已经用自制软件下载了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] [-
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,但如果遇到这种情况:只需在该脚本顶部添加一行,将aliasfind
添加到正确的脚本,或者您可以操纵$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版本。如果这些访问者看到这个被接受的答案,这对他们没有帮助。