繁体   English   中英

bash尾部文件夹中的最新文件不包含变量

[英]bash tail the newest file in folder without variable

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

$ 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

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

$ tail -n 100 some_log_c48b72e8.log 

这确实涉及体力劳动,所以我想使用bash-fu来做到这一点。

我目前发现可以这样做。

filename="$(ls -lat | sed -n 2p |  tail -c 30)"; tail -n 100 $filename

它可以工作,但是我很沮丧,我需要将数据保存到变量中才能执行此操作。 是否可以在bash中执行此操作而不将中间结果保存到变量中?

tail -n 100 "$(ls -at | head -n 1)"

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

以这种方式使用ls使用sedtail -c解析输出。 (和应该试图解析的输出ls )只需选择列表中的第一个文件( head -n 1 ),这是最新的。 将其放在引号中应该可以避免出现更常见的“问题”,例如文件名中的空格。 (如果文件名中包含换行符或类似内容,请修复文件名 。:-D)

您可以就地使用命令替换,而不是保存到变量中。

真正的无ls解决方案:

tail -n 100 < <(
  for f in *; do
    [[ $f -nt $newest ]] && newest=$f
  done
  cat "$newest"
  )

无需初始化newest ,因为任何文件都比空字符串命名的空文件新。

有点冗长,但是可以保证可以使用任何合法的文件名。 将其保存到shell函数中,以方便使用:

tail_latest () {
  dir=${1:-.}
  size=${2:-100}
  for f in "$dir"/*; do
      [[ $f -nt $newest ]] && newest=$f
  done
  tail -f "$size" "$newest"
}

一些例子:

# Default of 100 lines from newest file in the current directory
tail_latest
# 200 lines from the newest file in another directory
tail_latest /some/log/dir 200

zsh插件:glob限定符使您可以直接对glob的结果进行排序,从而更轻松地获取最新文件。

tail -n 100 *(om[1,1])

om按修改时间(最新的优先)对结果进行排序。 [1,1]限制了第一个匹配的文件范围。 (我认为Y1应该做同样的事情,但是它一直给我一个“未知文件属性”错误。)

您也可以尝试这种方式

ls -1t  | head -n 1  | xargs tail -c 50

说明:

ls   -1rht     -- list the files based on modified time in reverse order.
tail -n 1      -- get the last one file 
tail -c 50     -- show the last 50 character from the file.

如果不解析ls ,则可以使用stat

tail -n 100 "$(stat -c "%Y %n" * | sort -nk1,1 | tail -1 | cut -d" " -f 2-)"

如果文件名包含换行符,则会中断。


版本2:换行符可以

tail -n 100 "$(
    stat --printf "%Y:%n\0" * | 
    sort -z -t: -k1,1nr | 
    { IFS=: read -d '' time filename; echo "$filename"; }
)"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM