bash尾部没有变量的文件夹中的最新文件

can*_*his 1 linux bash tail

我在一个文件夹中有一堆日志文件.当我进入文件夹并查看文件时,它看起来像这样.

$ ls -lhat
-rw-r--r--   1 root root 5.3K Sep 10 12:22 some_log_c48b72e8.log
-rw-r--r--   1 root root 5.1M Sep 10 02:51 some_log_cebb6a28.log
-rw-r--r--   1 root root 1.1K Aug 25 14:21 some_log_edc96130.log
-rw-r--r--   1 root root 406K Aug 25 14:18 some_log_595c9c50.log
-rw-r--r--   1 root root  65K Aug 24 16:00 some_log_36d179b3.log
-rw-r--r--   1 root root  87K Aug 24 13:48 some_log_b29eb255.log
-rw-r--r--   1 root root  13M Aug 22 11:55 some_log_eae54d84.log
-rw-r--r--   1 root root 1.8M Aug 12 12:21 some_log_1aef4137.log
Run Code Online (Sandbox Code Playgroud)

我想查看最新日志文件中的最新消息.我现在可以手动复制最新日志的名称,然后对其执行尾部,这将起作用.

$ tail -n 100 some_log_c48b72e8.log 
Run Code Online (Sandbox Code Playgroud)

这确实涉及体力劳动,所以我想用bash-fu来做这件事.

我目前找到了这种方式;

filename="$(ls -lat | sed -n 2p |  tail -c 30)"; tail -n 100 $filename
Run Code Online (Sandbox Code Playgroud)

它有效,但我很遗憾我需要将数据保存到变量中才能完成.是否可以在bash中执行此操作而不将中间结果保存到变量中?

Dev*_*lar 7

tail -n 100 "$(ls -at | head -n 1)"
Run Code Online (Sandbox Code Playgroud)

您不需要ls实际打印时间戳,只需要按它们排序(ls -t).我添加了该-a选项,因为它在您的原始代码中,但请注意,除非您的日志文件是"点文件",否则这不是必需的,即以.(它们不应该).

使用ls这种方式可以避免使用sed和解析输出tail -c.(而且你应该尝试分析的输出ls.)只需选择的第一个文件列表(head -n 1),这是最新的.将它放在引号中应该可以避免更常见的"问题",例如文件名中的空格.(如果文件名中有换行符或类似内容,请修复文件名.:-D)

您可以使用命令替换而不是保存到变量中.

  • [为什么你不应该解析ls(1)的输出](http://mywiki.wooledge.org/ParsingLs)说_Unix几乎允许文件名中的任何字符,包括空格,换行符,逗号,管道符号和漂亮除了NUL_之外你还试图用作分隔符的其他任何东西然后_在默认模式下,如果标准输出不是终端,ls用newlines_分隔文件名.所以它一般都是`ls`,而不仅仅是`ls -l`. (3认同)
  • 一般来说,不太推荐依赖于`ls'的输出,但在这种情况下,它似乎是一个很好的方法.你也可以选择像``find.-type f -printf'%T @%p \n'| sort -n | tail -1`](http://stackoverflow.com/a/4561987/1983854) (2认同)