将 ls 的结果传送到尾部

Dew*_*oel 7 ls tail

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

data170213.log
data170214.log
data170215.log
data170216.log
Run Code Online (Sandbox Code Playgroud)

我有兴趣查看最新文件的最后一个条目并关注它。如果我知道最新的文件是data170216.log,我可以用

tail -f data170216.log
Run Code Online (Sandbox Code Playgroud)

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

ls -1r *.log | head -1
Run Code Online (Sandbox Code Playgroud)

无法解决的是如何发送命令ls -1r *.log |的结果。head -1到命令tail -f [FILE]

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

tail -f < ls -1r *.log | head -1
Run Code Online (Sandbox Code Playgroud)

Ste*_*itt 10

使用命令替换

tail -f "$(ls -1r *.log | head -n 1)"
Run Code Online (Sandbox Code Playgroud)

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

tail -f "data170216.log"
Run Code Online (Sandbox Code Playgroud)

这就是你所追求的。

注意head -n 1而不是head -1; 现在不推荐使用后一种形式。


Ija*_*han 5

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

$ ls -1r *.log | sed -n 1p | xargs tail -f
Run Code Online (Sandbox Code Playgroud)

或者:

$ ls -1r *.log | head -1 | xargs tail -f
Run Code Online (Sandbox Code Playgroud)

两者都工作正常。

man xargs

例子

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

find /tmp -name core -type f -print | xargs /bin/rm -f
Run Code Online (Sandbox Code Playgroud)

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

find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
Run Code Online (Sandbox Code Playgroud)

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

find /tmp -depth -name core -type f -delete
Run Code Online (Sandbox Code Playgroud)

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

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

cut -d: -f1 < /etc/passwd | sort | xargs echo
Run Code Online (Sandbox Code Playgroud)

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

xargs sh -c 'emacs "$@" < /dev/tty' emacs
Run Code Online (Sandbox Code Playgroud)