如何在包含特定字符串的目录中找到最新文件?

如何在包含特定字符串的目录中找到最新文件?

我需要在某个文件夹中搜索最新创建的文件并 grep 内容中的模式。到目前为止,我使用此命令取得了不错的成功:

find /var/log/folder -type f -printf '%T+ %p\n' | sort | tail -n1 | xargs grep 'string to find'

这确实找到了具有匹配项的最新文件,但我在标准输出中收到了意外的行。

$ find /var/log/folder -type f -printf '%T+ %p\n' |   sort | tail -n1 | xargs grep 'string to find'
grep: 2016-05-12+20:01:59.0570667340: No such file or directory
/var/log/folder/file:string to find

如何更改命令,使其不会出现“没有此类文件或目录”行?

答案1

ls -1rt /path/to/files/ | tail -n1会在目录中找到最新的文件(就修改时间而言);将其作为参数传递给grep

grep 'string to find' "$(ls -1rt /path/to/files/ | tail -n1)"

答案2

这是一个对于带有空格的名称是安全的版本:

find /var/log/folder -type f -printf '%T@ %p\0' | sort -rz | sed -Ezn '1s/[^ ]* //p' | xargs --null grep string

怎么运行的:

  • find /var/log/folder -type f -printf '%T@ %p\0'

    这将查找文件并打印其修改时间(秒),后跟一个空格及其名称,后跟一个 nul 字符。

  • sort -rz

    这会对以 null 分隔的数据进行排序。

  • sed -Ezn '1s/[^ ]* //p'

    sed -z处理空字符分隔行,这仅打印最新文件的名称

  • xargs --null grep string

    这将读取以 null 分隔的文件名并 grep 字符串。

答案3

zsh

grep string /var/log/**/*(.om)

使用om限定符时,文件om修改时间排序,从最新到最旧,就像ls -t..是将匹配限制为常规的文件。您可以添加m-1限制,以限制最后修改日期为最后一天或mh-1最后一周的文件h等。

如果/var/log目录是到其他地方的符号链接,并且您希望它们位于后面(例如 find find -L/ find -follow),则可以替换**/***/.

要在找到第一个匹配的文件后停止,您可以使用gawk

gawk '/string/ {print FILENAME": "$0; found++}
      ENDFILE  {if (found) exit}' /var/log/**/*(.om)

相关内容