如何在 Homebrew 中识别给定文件的包/公式,或包所拥有的所有文件的列表?
查看包中的所有文件:
brew ls <package>
要查找文件的包,请像这样查看该文件:
ls -l /usr/local/bin/whatever
如果它是由 Homebrew 安装的,它将是一个到
/usr/local/Cellar/something
的符号链接,这样就会告诉你它来自哪个包。
刚刚编写了这个脏函数来获取文件所属的brew包名称:
function brew_find_pkg {
file_to_search="$@"
for package in $(brew list); do
brew ls $package | grep -E -q "/${file_to_search}$"
if [ $? -eq 0 ]; then
echo $package
break
fi
done
}
只需在终端中输入即可。然后find找到一个文件所属的brew包,说文件
gsed
,就调用这样的函数
brew_find_pkg gsed
请注意,如果您提供文件的完整路径,该功能将不起作用。
可以根据指向二进制文件的符号链接(
Cellar/PACKAGE/...
)来确定包名称,例如
$ ls -la $(which awk) # => gawk
lrwxr-xr-x 1 kenorb 28 May 20 2015 /usr/local/bin/awk -> ../Cellar/gawk/4.1.1/bin/awk
$ ls -la $(which seq) # => coreutils
lrwxr-xr-x 1 kenorb 14 Apr 8 2015 /usr/local/opt/coreutils/libexec/gnubin/seq -> ../../bin/gseq
此功能适用于存储在
$( brew --prefix )/bin
目录中的命令。
function brew_find_pkg {
cmds_to_search="$@"
brew_bin=$( brew --prefix )/bin
for cmd in $cmd_to_search ; do
if [ -L $brew_bin/$cmd ] ; then
\ls -l $brew_bin/$cmd |cut -f 2 -d '>'
else
echo "$cmd is not a brew command"
fi
done
}
例如:
$ brew_find_pkg gawk gcc alskdfja
../Cellar/gawk/4.1.4_1/bin/gawk
../Cellar/gcc/5.3.0/bin/gcc
alskdfja is not a brew command
查找并酿造前缀,(例如对于 opencv):
find `brew --prefix opencv3`/ -exec ls -l {} \;
(请注意明智地使用 -exec,并且永远不要忘记那些 \;'s,伙计们 .. find 如何知道 -exec arg-list 已完成..)
Homebrew 软件包安装到 $(brew --prefix)/Cellar (通常是 /usr/local/Cellar)。
要找出文件属于哪些包,一种简单的方法是:
$ find $(brew --prefix)/Cellar/ | grep somefilename
我为它做了一个自制水龙头。
安装
% brew tap ten0s/brew-cache
构建/更新缓存
% brew cache -u
Building cache: fcbb2f2ca6958fa9218c035e8cfef96cd6e92164
Cache: fcbb2f2ca6958fa9218c035e8cfef96cd6e92164 is built
搜索
% brew cache -s 'lib/libgtk-3.dylib'
gtk+3 3.24.35
请参阅https://github.com/ten0s/homebrew-brew-cache了解更多详细信息`
我不喜欢这里的任何其他答案,因为它们不是自我记录的。一般来说,它所在的包位于地窖路径中,因此只需运行如下示例所示的代码:
$ ll $(which benchmark_xl)
lrwxr-xr-x 1 slu admin 42B Oct 9 14:07 /opt/homebrew/bin/benchmark_xl -> ../Cellar/jpeg-xl/0.8.2_1/bin/benchmark_xl