尝试创建打开最后修改的文件的别名

尝试创建打开最后修改的文件的别名

我经常做的一件事是编辑最近修改的文件,因此我想在 ~/.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.

假设和的bashGNU 实现,您可以使用如下函数实现相同的效果:findsort

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

例如编辑第三个最新文件。

相关内容