[英]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
使用sed
和tail -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.