单行命令来 cat ls -lrt 输出中的最后一个文件?

单行命令来 cat ls -lrt 输出中的最后一个文件?

系统日志文件是序列化的,我用ls -lrt它来显示最新的文件。然后我cat那个文件。这需要每次输入很长的序列号。

如何在一个命令中cat出现在输出中的最后一个文件?ls -lrt

我正在使用 cygwin,其输出ls -lrt foobar_job*如下所示:

-

-rw-r--r-- 1 zundarz Domain Users   1133 Jul 31 16:54 foobar_job4855125.log
-rw-r--r-- 1 zundarz Domain Users   1256 Jul 31 17:10 foobar_job4855127.log
-rw-r--r-- 1 zundarz Domain Users   1389 Aug 11 10:20 foobar_job4887829.log
-rw-r--r-- 1 zundarz Domain Users   1228 Aug 11 10:39 foobar_job4887834.log

答案1

如果您只想cat在一个命令中使用最新的文件,那么您实际上不需要-l选项。打开后LinuxCygwin您可以使用-1选项并使解析变得更加容易:

$ cat "$(ls -1rt | tail -n1)"

-1应该非常便携,它在POSIX

还要记住解析ls输出有其缺点

编辑:

正如正确指出的评论者:don_crissti你甚至不需要-1

 $ cat "$(ls -rt | tail -n1)"

答案2

此方法在正确性方面得分不高,但在大多数情况下应该有效:cat "$(ls -1t | head -n1)"

答案3

在我的系统上尝试了一下:

~$ cat "$(ls -lrt | tail -n 1 | tr -s ' ' | cut -d ' ' -f9-)"

工作了。

ls -lrt

-t以相反顺序 ( )给出按修改时间 ( ) 排序的文件-r

tail -n 1

为您提供输出的最后一行。

tr -s ''

删除行中的重复空格。

cut -d ' ' -f9-

剪切每个空格的行并给出第 9 个字段,即文件名。添加--f9还会给出所有以下字段,这对于包含空格的文件名很重要。

别名

如果要将命令用作别名,则必须对字符进行转义"

命令中的' 是必需的,因为文件可以有空格,如果没有用'括起来,"该命令将被解释为多个文件。cat"

逃离这个标志也是必要的$。否则,内部命令$(...)将在设置别名时执行一次,而不是每次调用别名时都执行。

alias catrec="cat \"\$(ls -lrt | tail -n 1 | tr -s ' ' | cut -d ' ' -f9-)\""

答案4

Bash 一行(前提是你的文件名不包含空格):

cat $(ls -lrt | tail -1 | rev | cut -d" " -f1 | rev)

解释:

tail -1        # get last line of your ls
rev            # reverse characters order
cut -d" " -f1  # take first field using space as a separator

因此,这rev | cut -d" " -f1 | rev是一个技巧,可以确保获得最后一个空格分隔的单词,而不必提供与平台相关的字符偏移量字段号。

相关内容