我使用下面的方法根据内容和文件名检索某些文件:
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
( %y
for 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
且不可定制的,尽管您也可以使用%Y
for1686734585
和%.Y
for 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
不会运行。