我需要在某个文件夹中搜索最新创建的文件并 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
限定符时,文件o
按m
修改时间排序,从最新到最旧,就像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)