grep 后返回文件名和文件创建日期

grep 后返回文件名和文件创建日期

我使用下面的方法根据内容和文件名检索某些文件:

find /labels/ -type f -iname '*.*' -exec grep -l 'MB2306' {} +

现在我还需要知道返回文件的创建日期。我需要在这里改变什么才能实现这一目标?

find 在 Red Hat Enterprise 8.8 上的 4.6.0 上运行

答案1

-files0-from使用GNUfind和 GNU的最新版本(4.9 或更高版本)grep或兼容:

find /labels/ -type f -name '*.*' -exec grep -Zl MB2306 {} + |
  find -files0-from - -prune -printf '%TFT%TT%Tz %p\n'

对于其他find实现或旧版本的 GNU find,并且如果您还有 GNUxargs和 GNUstat可用:

find /labels/ -type f -name '*.*' -exec grep -Zl MB2306 {} + |
  xargs -r0 stat -c '%y %n' --

%T( %yfor stat) 为最后修改时间,也可以看作是创建时间内容这些文件。您可以将文件的出生时间替换为%B(%w对于 GNU ),但这并非在所有系统和文件系统上都可用,并且通常不是一个有用的指标,具体取决于您到底想要什么。stat

请注意,-name '*.*'(-iname没有多大意义,因为该模式中没有字母) 是报告名称完全由文本组成且至少包含一个..请注意,它还匹配名为 example 的文件.bashrc。如果您想匹配具有扩展名的文件,无论文件名是否由文本组成,您都需要LC_ALL=C find ... -name '?*.*'¹.如果您想要任何文件,无论其名称如何,您只需省略这些-name pattern.

zsh shellfind的 glob 中提供了大部分功能,支持递归和按文件类型过滤,并且有一个stat内置功能(自 1997 年起,早于 GNU stat),因此在该 shell 中,可以通过以下方式完成:

zmodload zsh/stat
stat -nLF %FT%T.%N%z +mtime ${(0)"$(
  grep -lZ MB2306 /labels/**/?*.*(ND.))"}

(仍然假设 GNUgrep或兼容其-Z选项,并且这里不限于纯文本文件名)。

%FT%T.%N%z strftime()规范(此处扩展%N为纳秒)或 GNUfind-printf等效项%TFT%TT%Tz为您提供了标准的非模糊2023-06-14T10:23:05.047789132+0100格式。您可以根据自己的喜好进行调整,请参阅 参考资料man strftime格式的详细信息。

GNUstat的格式是2023-06-14 10:23:05.047789132 +0100且不可定制的,尽管您也可以使用%Yfor1686734585%.Yfor 1686734585.047789132


¹ 这LC_ALL=C也会影响grep文件内容以及它如何解释文件内容,但是当您在这里寻找固定字符串时,这不应该有任何不同,如果有什么可能甚至会加快速度。

答案2

find命令AND是所有谓词(除非您使用谓词-o),因此您可以附加ls -l --time=creation(您的操作系统应该支持,我在Alma 9.1上验证),并获取匹配文件的创建时间列表:

find /labels/ -type f -iname '*.*' -exec grep -q 'MB2306' {} \; -exec ls -l --time=creation {} \;`

我更改grep为,-q因为您只需要知道文件是否匹配:如果匹配,则ls运行;如果没有,则ls不会运行。

相关内容