首页 > 解决方案 > 如何跟踪(tail -f)目录中的最新文件(匹配模式)并作为带参数的别名调用

问题描述

我有一个充满日志文件的目录,我想要一个 bash oneline 命令来跟踪与模式匹配的最新日志文件(例如“logfile*”)。基本上我有一条线应该可以工作,只是它没有......

tail -f $(ls -1rt logfile* | tail -n 1)

当我像这样只测试部分命令时

ls -1rt logfile* | tail -n 1
logfile_20210111_105242.log

它将为我提供我想要遵循的最新日志文件名:

但添加tail -f我得到以下回复:

tail -f $(ls -1rt logfile* | tail -n 1)
tail: cannot open ''$'\033''[0m'$'\033''[00mlogfile_20210111_105242.log'$'\033''[0m' for reading: No such file or directory

关于如何让它发挥作用的任何想法?

编辑:另外,知道如何最好地在带有参数的别名中使用它吗?大多数研究表明.bashrc必须使用一个函数,但我也发现有人说它应该可以通过!:1用作变量来实现。

EDIT2:解决方案

Step1:使用下面评论中的解决方案

tail -f $(find . -maxdepth 1 -name 'logfile*' -printf '%Ts/%f\n' | sort -n | tail -1 | cut -d/ -f2)

第2步:将其放入.alias并使其与文件模式的参数一起使用

alias tailf="tail -f $(find . -maxdepth 1 -name '\!:1' -printf '%Ts/%f\n' | sort -n | tail -1 | cut -d/ -f2)"

EDIT3:虽然别名似乎有效,但不幸的是,它会拖尾与作为参数传递的模式匹配的所有文件。当我在别名定义中对模式进行硬编码时,它可以完美地工作,只是尾随与该模式匹配的最新文件。

谢谢

标签: linuxbashtail

解决方案


tail -f "$(find . -maxdepth 1 -name "logfile*" -printf "%Ts/%f\n" | sort -n | tail -1 | cut -d/ -f2)"

跟踪 find 命令的结果。在当前目录中搜索以 logfile 为前缀的文件,并打印创建的纪元时间以及文件路径和名称,用正斜杠分隔 通过管道将其排序,然后打印带有 tail -1 的最新条目,然后剥离到只保留带有剪切的文件路径。


推荐阅读