Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 自制:如何列出N个最近安装的软件包?_Macos_Homebrew_Jq - Fatal编程技术网

Macos 自制:如何列出N个最近安装的软件包?

Macos 自制:如何列出N个最近安装的软件包?,macos,homebrew,jq,Macos,Homebrew,Jq,简单地说:我想列出我用自制软件安装的最后N个软件包 实现这一目标的最佳(可能最快)方法是什么 请注意,我对Ruby不太精通,因此任何关于“破解自制代码以实现您的愿望”的建议都会让我感到紧张 到目前为止我试过什么 阅读手册页、文档、自制网站、StackOverflow、谷歌搜索各种各样的问题等。目前为止运气不好 brew info[formula | cask]实际上会告诉您倾倒配方奶粉/木桶的日期(我认为这意味着“安装”在Homebrewosphere之外)。所以这个值必须写在某个地方——数据库

简单地说:我想列出我用自制软件安装的最后N个软件包

实现这一目标的最佳(可能最快)方法是什么

请注意,我对Ruby不太精通,因此任何关于“破解自制代码以实现您的愿望”的建议都会让我感到紧张

到目前为止我试过什么
  • 阅读手册页、文档、自制网站、StackOverflow、谷歌搜索各种各样的问题等。目前为止运气不好
  • brew info[formula | cask]
    实际上会告诉您倾倒配方奶粉/木桶的日期(我认为这意味着“安装”在Homebrewosphere之外)。所以这个值必须写在某个地方——数据库?日志
  • 也许有一个选项可以通过提取倾倒日期信息?但事实是,使用自制的3.1.9-121-g654c78c,我无法在JSON输出中获得任何
    倾倒日期
    或类似元素。。。我得到的唯一日期与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
      -想法是在行中只包含日期和公式名称,以便可以轻松排序[注意:我知道显示的正则表达式不起作用,这只是我放弃此方法之前失败尝试的一部分]
    凌乱。处理每件事也需要很多时间。如果你准备盯着一个空白屏幕等待几分钟,你可以把它全部放在一行,避免中间文件

    又快又脏的方法 我试图查找a)安装日志;b)某种数据库,其中
    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