Macos 自制:如何列出N个最近安装的软件包?
简单地说:我想列出我用自制软件安装的最后N个软件包 实现这一目标的最佳(可能最快)方法是什么 请注意,我对Ruby不太精通,因此任何关于“破解自制代码以实现您的愿望”的建议都会让我感到紧张 到目前为止我试过什么Macos 自制:如何列出N个最近安装的软件包?,macos,homebrew,jq,Macos,Homebrew,Jq,简单地说:我想列出我用自制软件安装的最后N个软件包 实现这一目标的最佳(可能最快)方法是什么 请注意,我对Ruby不太精通,因此任何关于“破解自制代码以实现您的愿望”的建议都会让我感到紧张 到目前为止我试过什么 阅读手册页、文档、自制网站、StackOverflow、谷歌搜索各种各样的问题等。目前为止运气不好 brew info[formula | cask]实际上会告诉您倾倒配方奶粉/木桶的日期(我认为这意味着“安装”在Homebrewosphere之外)。所以这个值必须写在某个地方——数据库
brew info[formula | cask]
实际上会告诉您倾倒配方奶粉/木桶的日期(我认为这意味着“安装”在Homebrewosphere之外)。所以这个值必须写在某个地方——数据库?日志倾倒日期
或类似元素。。。我得到的唯一日期与git有关(大概是因为它们对自制的内部工作更有用)。理论上,这可以告诉我我安装的公式的“最新”版本是什么,但不能告诉我安装它们的顺序——换句话说,我可以昨天安装一个有一年历史的版本,我不需要知道它已经一年了,我只想知道我昨天安装的李>
到目前为止我学到了什么
虽然我不知道如何检索这些信息,但我确信它确实存在,因为brew info…
将给出正确的日期,特别是倒入配方奶粉的日期。因此,一种可能的解决方案是从brew info
捕获所有信息,然后对其执行grep
;因此,像brew info | grep
这样的东西应该能满足我的需求。不用说,这需要永恒来运行(事实上,我从未设法完成它——几分钟后我就放弃了)
当然,我发现有一个brew info--installed
选项,但目前它只适用于JSON输出。而且由于JSON输出不会告诉倾倒日期,因此这是没有用的
一种可能是通过以下方式进行:
- 使用
brew信息--installed--json=v1 | jq“map(.name)”>inst.json提取所有已安装的软件包名称
- 分析结果,使其成为一行,例如,
cat inst.json | tr-d'\n\r\[\]\“\,”
- 现在用这一行运行
(将所有内容视为一个公式以避免警告),将结果导入另一个文件(例如brew信息--formula
)all installed.txt
- 检查该文件,提取带有公式名称和日期的行,并使用类似于
-想法是在行中只包含日期和公式名称,以便可以轻松排序[注意:我知道显示的正则表达式不起作用,这只是我放弃此方法之前失败尝试的一部分]cat all-installed.txt | sed-E的/([[:alnum:]+):?stable.*\n(.*\n){3,7}^从(.*)上的瓶子中倒入$/\1--\3\\n/g'| sort | tail-40
brew
将存储我试图提取的信息(以及brew info
可以访问的信息)。我发现的大多数“日志”实际上与修补单个包有关(因此,如果出现问题,您可以向维护人员发送电子邮件)。然而,我也很偶然地注意到,每个软件包都有一个INSTALL\u RECEIPT.json
内部/usr/local/cillar/
,它的输出似乎是brew info--json=v1 package name
。无论这个文件的用途如何,它都有一点宝贵的信息:它是在这个软件包创建之日创建的已安装
这对我来说是相当幸运的,因为现在我可以简单地stat
这个文件并获得它的创建时间戳。因为公式目录的格式非常好,很容易解析,我可以做一些非常简单的事情,只需使用stat
和一些格式化的东西,我花了很长时间才弄明白(主要是因为受BSD启发的Unix下的stat
与受SysV启发的Linux下流行的Unix有不同的选项)
例如,要获取最近安装的40个公式:
stat-t“%Y%m%d%H%m'-f”%Sc%N%@/usr/local/ceral/*/*/INSTALL_receive.json|sort|tail-40
这运行得相当快,而且我确实获得了另一个项目所需的东西(列出了我必须安装的最后几个公式,以便运行我试图在macOS下编译的某个软件包,并记录所需内容),但我一直想知道这是否是“最好”的方法。当然,它足够快了——使用标准工具遍历文件系统树要比期望Ruby做慢节奏的工作快得多——但是我怎么知道我有“正确”的信息呢?所有包都有安装回执.json
?如果自制核心开发了呢rs考虑完全改变整个目录结构?或者停止编写INSTALL\u receive.json
文件,因为他们在“别处”(where?)使用数据库这就变得多余了?换句话说,我怎样才能以一种经得起未来考验的方式,仅仅依靠brew
命令已经提供的任何信息来确定我想要什么
无论如何,为了讨论这个问题,我很乐意看到一些关于如何正确执行此操作的建议,并且不会像我使用stat
时那样“作弊”(例如,不使用brew
命令)
brew list -1t 2> /dev/null | head -n 40
==> Formulae
ls -t /usr/local/Cellar
CELLAR=$(brew --prefix)/Cellar
jq -nr --arg cellar "$CELLAR" '
[inputs | {time, file: (input_filename|sub($cellar;"") | sub("/INSTALL_RECEIPT.json";""))}]
| sort_by(.time)[-40:][]
| .file
' $CELLAR/*/*/INSTALL_RECEIPT.json