我有一个包含一堆日志文件的目录。像这样的东西:
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