我正在考虑使用最后更改的文件作为 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