当我运行这个命令时,
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
答案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