我经常做的一件事是编辑最近修改的文件,因此我想在 ~/.bash_profile 文件中创建一些快捷方式,而不是输入“ls -lr”然后“vim lastfile”:
alias via="vim `ls -rt | tail -1`"
alias vib="vim `ls -rt | tail -2 | head -1`"
alias vic="vim `ls -rt | tail -3 | head -1`"
alias vid="vim `ls -rt | tail -4 | head -1`"
alias vie="vim `ls -rt | tail -5 | head -1`"
奇怪的是,问题是这些命令不起作用。他们打开了一些不是最后一个的文件,甚至从当前目录中删除了一个文件(我想知道该目录中是否存在某种文件缓存更新问题。这种情况发生在我的本地计算机和我的集群上)从事于)。
但是,如果我vim `ls -rt | tail -1`
直接键入而不使用别名,它每次都会起作用。
答案1
问题是您需要在别名定义中引用反引号。双引号 ( "
) 不引用命令替换。您将需要单引号 ( '
)。使用
alias via='vim `ls -rt | tail -1`'
虽然你实际上想要:
alias via='vim -- "$(ls -t | head -n 1)"'
那是:
$(...)
当我们这样做时,使用现代形式的命令替换( )。- 引用它以禁用 split+glob 运算符(否则,如果文件名具有 IFS 字符或通配符,它将无法正常工作(如果它具有换行符,它仍然无法正常工作))。
- 用于
--
标记 选项的结尾(否则,对于以或vim
开头的文件名不起作用)。-
+
- 使用
ls -t | head
而不是ls -rt | tail
更快地得到结果。
不使用
alias via="vim `ls -rt | tail -1`"
如果您这样做,命令替换会在您定义别名时发生,而不是在您运行它时发生。尝试输入alias via
以查看输出实际上alias via='vim `ls -rt | tail -1`'
不是alias via='vim <prematurely expanded output>'
.
答案2
With zsh
(也在 OS/X 上预安装)并假设您正在使用完成系统(compinit
和 co),Ctrl+Xm成为扩展到最新文件的完成器。
所以:
六Ctrl+Xm
会让您编辑最新的文件(您还有机会在按 之前查看它Return)。
六Alt+2Ctrl+Xm
对于第二个最新的文件。
六*.cCtrl+Xm
获取最新c
文件。
六 *(.)Ctrl+Xm
对于最新的常规的文件(不是目录,也不是 fifo/设备...),等等。
您还将别名定义为:
alias via='vim -- *(.om[1])'
编辑当前目录中的最新(非隐藏)常规文件,而不会出现解析ls
.
假设和的bash
GNU 实现,您可以使用如下函数实现相同的效果:find
sort
via() {
local file
IFS=/ read -rd '' file file < <(
find . -maxdepth 1 -type f ! -name '.*' -printf '%T@/%f\0' |
sort -rzn
) && vim -- "$file"
}
您可以对其进行参数化,以便能够指定第二个、第三个...最新文件(假设是 GNU Bash 4.4 或更高版本以及 GNU coreutils 8.25 或更高版本):
via() {
local files
readarray -d '' -t files < <(
find . -maxdepth 1 -type f ! -name '.*' -printf '%T@/%f\0' |
sort -rzn | cut -zd / -f 2
) && ((${#files[@]} >= ${1-1} )) && vim -- "${files[${1-1}-1]}"
}
用作:
via 3
例如编辑第三个最新文件。