如何按日期顺序grep文件

4
我可以使用以下命令,将某个目录中的Python文件按照最近更新时间排序:
```ls -lt *.py```
ls -lt *.py

但我该如何按照那个顺序使用grep搜索这些文件呢?

我知道应该避免尝试解析ls的输出,因为那是非常危险的。

2个回答

10
你可以使用这个管道来使用gnu工具实现这一目标:
find . -maxdepth 1 -name '*.py' -printf '%T@:%p\0' |
sort -z -t : -rnk1 |
cut -z -d : -f2- |
xargs -0 grep 'pattern'

这将处理具有特殊字符(如空格、换行符、通配符等)的文件名。

  1. find 命令在当前目录中查找所有 *.py 文件,并打印修改时间(epoch 值) + 冒号 + 文件名 + NUL 字节。
  2. sort 命令在第一列(即时间戳)上执行反向数值排序。
  3. cut 命令从输出中删除第一列(时间戳)。
  4. xargs -0 grep 命令在每个文件中搜索 pattern

1
谢谢。这比我预期的要复杂得多! - Simd
eval "sorted=($(ls -t --quoting-style=shell-escape *.py))"; grep foo "${sorted[@]}" 怎么样? - Simd
1
请参见 http://mywiki.wooledge.org/ParsingLs 底部。--quoting-style=shell-escape 是避免解析问题的官方方式。 - Simd
好的,谢谢。但是你仍然需要编写更多的代码才能够在每个文件名上运行 grep - anubhava
是的。grep 已经包含在我粘贴的一行代码中了。 - Simd
1
哦,是的,那很好。顺便说一下,--quoting-style=c 也可以使用,并且更短一些。 - anubhava

1

如果你想按时间顺序获取包含特定模式的文件列表,有一个非常简单的方法:

grep -sil <searchpattern> <files-to-grep> | xargs ls -ltr

例如,您在*.txt文件中使用grep命令搜索"hello world",使用-sil选项使grep命令不区分大小写(-i),抑制消息输出(-s)并只列出文件名(-l);然后将其传递给ls命令(使用| xargs),按日期排序(-t),显示日期(-l)和所有文件(-a)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接