自动完成最新文件


13

我有一个创建文本文件的过程,该文件的文件名基于其创建时间的时间戳:

$ ls
1378971222.txt
1378971254.txt
1378971482.txt
1378971488.txt
1378972089.txt
1378972140.txt
1378972141.txt
1378972153.txt
1378972155.txt
1378972241.txt

如何自动完成最新创建的文件的文件名,即具有最新mtime的文件?无法对这些文件使用制表符补全,因为文件名中的几乎每个字符都与另一个文件共享。我希望找到一个快捷方式(例如Alt .自动完成last命令的最后一个参数的快捷方式)。我已成功地炮制以下别名这是伟大的VIM,但我很想知道,如果一个通用的快捷方式存在,我可以用用kde-opensqlite3和其他应用程序。

alias lastest="vim `ls -t | grep -vE "^total [0-9]*$" | head -n1`"


读完所有内容后,对于如何在bash shell中使用键盘快捷方式插入最新的文件路径(bash补全,并且希望也按时间顺序循环),问题似乎还没有令人满意的答案?
罗曼·苏西

@RomanSusi:这个最接近的答案是Weidenrinde的,但它只在行中插入了文字$(ls -t|head -1)。因此,请勿骑车。在没有令人满意的答案的情况下,我接受了对我有最多启发并提供最多效用的答案。
dotancohen

当然。在我看来,它可能是一个很酷的shell功能,想知道为什么没人实现它。
罗曼·苏西

Answers:


6

只需vim从别名中删除。做这样的事情:

alias latest='ls -tr | tail -n 1'

然后,您可以使用任何程序打开最新文件:

emacs `latest`
ls `latest`
mv `latest` ../

等等

但是,如果文件名中包含空格或怪异字符,这将中断,这就是为什么您永远不要解析的原因ls。更好的方法是这样(将其添加到您的.bashrc):

function latest(){
  $1 "$(find . -type f -printf "%C@ %p\n" | sort | tail -n 1 | cut -d " " -f 2-)"
}

该函数将执行您提供给它的任何命令作为参数,并将find调用结果(最新文件)传递给该命令。因此,您可以执行以下操作:

latest emacs
latest less

如果您需要执行类似操作,请mv $(latest) foo/尝试以下操作:

function latest(){
   A=(${@})
   prog=$1;
   lat=$(find . -type f -printf "%C@ %p\n" | sort | tail -n 1 | cut -d " " -f 2-)
   if [ ! -z $2 ] ; then 
     args=${A[@]:1}; 
     $prog "$lat" "${A[@]:1}"
   else
     $prog "$lat"
   fi
}

然后,要将最新文件复制到bar/,您可以

latest cp bar

而且您仍然可以latest emacs像以前一样进行操作。


谢谢,我在这里可以学到很多东西。
dotancohen

我建议alias latest='\ls -tr | tail -n 1'-如果您使用ls别名,则可以使用。
domen

6

您可以轻松地在中配置它zsh,例如,使用类似这样的东西:

zstyle ':completion:*' file-sort date

(您也可以更改该行,以使该样式仅用于某些文件名模式)

zsh 与bash非常相似,您可以将其称为bash的超集-按功能/使用方式。

但是也许bash具有类似的功能。


谢谢,太好了。由于一些原因,我不想搬到,zsh但如果我愿意,我已将此标签加为书签!
dotancohen

感谢您向我介绍zsh
dotancohen

3

由于最新文件也排在最后,因此您可以使用menu-complete-backwardmenu-completemenu-complete-backward循环完成,或插入第一个或最后一个完成。我将它们绑定到option-tab和shift-tab中~/.inputrc

"\e\t": menu-complete
"\e[Z": menu-complete-backward

\e[Z当您按shift-tab时,终端仿真器可能不会插入。使用C-vcat -v查看按组合键时插入的文本。


实际上,文件是按字母顺序而不是按时间顺序排序的。如果我想出如何按时间排序,那么我将更新信息。
dotancohen

2

问题的背景是使用速度。我发现键盘宏最合适。添加到~/.inputrc

# Alt-L --> newest file in directory
"\el": "$(ls -t|head -1)"

进一步的想法:最初,我想要提供给我第一,第二,第三最新文件的东西。一个想法是,用标记标记地点,例如“ grep x _”,然后执行键盘宏“ \ C-alatest-expansion \ Cm”,然后“ latest-expansion”提示从中选择一个诅咒选择列表命令行中每个“ _”标记的最新文件。

我认为这是一个重要的问题,因为对我而言,GUI优于SHELL的另一个优势是对最近使用/创建的文件和目录的选择。autojump对于目录有所帮助,但缺少文件解决方案。


谢谢,这是有帮助的。注意,它$(ls -t|head -1)在bash行中插入了文字,因此需要对其进行解释。这使它用处不大,但这仍然是一个不错的技巧。
dotancohen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.