如何按创建文件的时间+日期对 grep 输出进行排序?

如何按创建文件的时间+日期对 grep 输出进行排序?

当我运行这个命令时,

grep _rlnAveragePmax *model*

我得到这个输出:

run_ct6_it006_model.star:_rlnAveragePmax                             0.153500
run_ct6_it007_model.star:_rlnAveragePmax                             0.096772
run_it000_model.star:_rlnAveragePmax                             0.000000
run_it001_model.star:_rlnAveragePmax                             0.008995
run_it002_model.star:_rlnAveragePmax                         2.517429e-04
run_it003_model.star:_rlnAveragePmax                             0.003727
run_it004_model.star:_rlnAveragePmax                             0.056681
run_it005_model.star:_rlnAveragePmax                             0.109754
run_it006_model.star:_rlnAveragePmax                             0.153500

但上面的输出是按字母顺序排序的。如果我们按创建时间+日期对它们进行排序,则输出应如下所示:

run_it000_model.star:_rlnAveragePmax                             0.000000
run_it001_model.star:_rlnAveragePmax                             0.008995
run_it002_model.star:_rlnAveragePmax                         2.517429e-04
run_it003_model.star:_rlnAveragePmax                             0.003727
run_it004_model.star:_rlnAveragePmax                             0.056681
run_it005_model.star:_rlnAveragePmax                             0.109754
run_it006_model.star:_rlnAveragePmax                             0.153500
run_ct6_it006_model.star:_rlnAveragePmax                             0.153500
run_ct6_it007_model.star:_rlnAveragePmax                             0.096772

我需要对 grep 命令执行什么操作才能获得按创建时间+日期排序的输出?

答案1

除非您运行的是 macOS,否则不会存储文件的创建日期。无论如何,这个概念的定义并不明确,因为编辑文件通常会创建一个新文件来替换以前的版本。记录的是文件的最后修改日期(包括初始创建和任何后续编辑)。

按修改时间对文件进行排序的最简单方法是运行桀骜(与其他功能较弱的 shell 相反,例如 bash、ksh 或 Fish)。在 zsh 中,您可以使用全局限定符例如Om按修改时间对文件进行排序(最旧的在前,Om最年轻的在前)。

grep _rlnAveragePmax *model*(Om)

这给出了所需的结果,因为grep按照命令行上给出的顺序遍历文件。

答案2

首先执行时间排序的 ls,然后通过 xargs 将 stdout 通过管道传输到 grep,使用 -H 标志来包含文件名(因为它只会对一个文件执行此操作,默认情况下不包含文件名)

在 ls 之后的第一个 grep 中,目录被排除(认为这不是您提供的示例中的递归搜索)。 ls 之后的第二个 grep,过滤文件名(不带 xargs)

ls -tpQ --quoting-style=shell | grep -v / | grep model | xargs -i grep -H _rlnAveragePmax {}

在通配符的宝贵意见后更新:为了考虑到文件名可能包含奇怪字符的所有情况,从 ls 中提取 inode 编号,并通过管道传输到“find”以进行 inode 编号匹配并执行 grep 命令。 xargs 被替换为“while read line”,因为 xargs 命令无法区分两个 {}

遵循符号链接,仅包含文件,不包括目录等。 max深度参数在这种情况下是多余的(仅留下文件),但是我包含它,以便也可以进行递归搜索,更改参数:

ls -ti | cut -d " " -f1 | while read line; do find -L . -maxdepth 1 -type f -inum $line -exec grep -H xxx {} \; ; done

相关内容