将 ls 的结果通过管道传输到 tail

将 ls 的结果通过管道传输到 tail

我有一个包含一堆日志文件的目录。像这样的东西:

data170213.log
data170214.log
data170215.log
data170216.log

我有兴趣查看最新文件的最后条目并跟踪它。如果我知道最新的文件是数据170216.log,我可以这样做

tail -f data170216.log

问题是,我不知道目录中最新文件的名称是什么。我可以识别它

ls -1r *.log | head -1

我不知道如何发送命令的结果ls -1r *.log | ls -1r *.log |头-1到命令尾部-f [文件]

我尝试了以下方法,但没有成功

tail -f < ls -1r *.log | head -1

答案1

用一个命令替换

tail -f "$(ls -1r *.log | head -n 1)"

ls -1r *.log | head -n 1在子 shell 中运行,获取其输出,并使用它构建一个新命令;所以如果ls管道输出data170216.log,命令就变成

tail -f "data170216.log"

这就是你所追求的。

注意head -n 1而不是head -1;后一种形式现已弃用。

答案2

您可以xargs在这种情况下使用。可能简单易行的是:

$ ls -1r *.log | sed -n 1p | xargs tail -f

或者:

$ ls -1r *.log | head -1 | xargs tail -f

两者都工作正常。

man xargs

例子

在/tmp目录下找到名为core的文件并将其删除。请注意,如果有任何文件名包含换行符或空格,这将无法正常工作:

find /tmp -name core -type f -print | xargs /bin/rm -f

在目录 /tmp 中或目录下查找名为 core 的文件并将其删除,以正确处理包含空格或换行符的文件或目录名的方式处理文件名:

find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f

在目录 /tmp 中或目录下查找名为 core 的文件并将其删除,以正确处理包含空格或换行符的文件或目录名的方式处理文件名:

find /tmp -depth -name core -type f -delete

在目录 /tmp 中或目录下查找名为 core 的文件并删除它们,但比前面的示例更有效(因为我们避免了使用 fork(2) 和 exec(2) 来启动 rm 并且我们不需要额外的 xargs 进程)

生成系统上所有用户的紧凑列表:

cut -d: -f1 < /etc/passwd | sort | xargs echo

依次启动编辑 xargs 标准输入上列出的文件所需的最小数量的 Emacs 副本。此示例实现了与 BSD 的 -o 选项相同的效果,但以更灵活和可移植的方式:

xargs sh -c 'emacs "$@" < /dev/tty' emacs

相关内容