在vim中打开最近修改的文件

Ice*_*can 5 shell pipe vi date files

以下命令有效

$ ls -1t | head -1
git_sync_log20180924_00.txt

$ vi git_sync_log20180924_00.txt
Run Code Online (Sandbox Code Playgroud)

但这不

$ ls -1t | head -1 | vi
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点(在 vi 中打开最近修改的文件)?

Sté*_*las 13

vi -- "$(ls -t | head -n 1)"
Run Code Online (Sandbox Code Playgroud)

(假设文件名不包含换行符)。

或者如果使用zsh:

vi ./*(om[1])
Run Code Online (Sandbox Code Playgroud)

或者:

vi ./*(.om[1])
Run Code Online (Sandbox Code Playgroud)

只考虑常规文件。

vi ./*(.Dom[1])
Run Code Online (Sandbox Code Playgroud)

还要考虑隐藏文件(就像使用ls -At)。

无论文件名可能包含什么字符或字节值,这些都可以工作。对于与后一个等效的 GNU shell&utilities,您可以执行以下操作:

IFS= read -rd '' file < <(
  find . ! -name . -prune -type f -printf '%T@\t%p\0' | sort -zrn | cut -zf2-) &&
  vi "$file"
Run Code Online (Sandbox Code Playgroud)


mkc*_*mkc 6

使用您的管道结构,您可以xargs像这样使用:

ls -1t | head -1 | xargs vi
Run Code Online (Sandbox Code Playgroud)

  • 假设文件名不包含空格、换行符、单引号、双引号、反斜杠,也意味着 `vi` 的 stdin 将是来自 `head` 或 `/dev/null` 的管道,具体取决于 `xargs ` 实现而不是 tty。 (2认同)