如何在 Linux 中使用最后更改的文件作为参数?

如何在 Linux 中使用最后更改的文件作为参数?

我正在考虑使用最后更改的文件作为 ls、echo 或 cat 等命令的参数,有没有简单有效的方法?当我面临分析最新日志文件或任何经常写入的文件时,就会出现这个问题。

感谢你们。

答案1

不,没有真正简单的方法,主要是因为这需要使用任意文件名。因此,虽然类似这样的命令ls -tr | tail -n1会显示当前目录中修改的最后一个文件,但如果最后一个文件的名称有换行符,它将不起作用。举个例子更容易解释这一点:

$ touch normal_file
$ ls -ltr | tail -n1-rw-r--r-- 1 terdon terdon          0 Mar 11 16:11 normal_file

但文件名不好?

$ touch bad$'\n'file
$ ls -ltr | tail -n1
file

$ ls 
'bad'$'\n''file'   normal_file

由于错误的文件名包含换行符,因此tail只显示名称的一部分。因此,直接的方法last_file=$(ls -tr | tail -n1)在这里会失败。

但是,较新版本ls有一个--zero选项:

       --zero end each output line with NUL, not newline

这意味着你现在可以这样做了!因此,将其添加到你的~/.bashrc文件中:

last_file() {
   ls -tr --zero | tail -zn1
}

您现在可以执行以下操作:

$ aa=$(last_file)
bash: warning: command substitution: ignored null byte in input
$ echo "$aa"
bad
file

因此,要将当前目录中最后修改的文件作为参数传递给命令,例如ls,您可以执行以下操作:

 $ ls "$(last_file)"
bash: warning: command substitution: ignored null byte in input
'bad'$'\n''file'

您只需忽略警告即可。或者,我们可以\0通过将函数更改~/.bashrc

last_file() {
   ls -tr --zero | tail -zn1 | tr -d '\0'
}

最后我们可以这样做:

$ ls "$(last_file)"
'bad'$'\n''file'

这仍然不太方便,因为您需要编写代码"$(last_file)"来引用它。因此,您可以改为让函数设置一个变量,然后使用该函数作为特殊PROMPT_COMMAND变量的值,该变量设置将在显示新提示之前运行的命令。这意味着它会在新的 shell 会话启动时以及在终端中运行任何命令后运行。因此,将这些行添加到您的代码中~/.bashrc以代替上面的代码:

last_file() {
  lf=$(ls -tr --zero | tail -zn1 | tr -d '\0')
}
PROMPT_COMMAND="last_file"

现在,打开一个新终端,您可以使用变量$lf来显示最后一个文件(或目录,如果目录是最后修改的):

$ echo "$lf"
bad
file

相关内容