如何使用命令用 vi 打开第一个搜索结果?

如何使用命令用 vi 打开第一个搜索结果?

每次我需要查找文件然后打开它时,我必须使用: find ./ -name ****.properties. ,然后复制结果,然后 vi “将结果粘贴到这里”。如果我需要使用鼠标,可能会有点麻烦。那么有没有更好的方法来做到这一点?

答案1

您可以使用 AWK 或 sed 打开任意文件来打印特定的行号。

vi "$(find ./ -name **.properties | awk 'NR==2')"

或者

vi "$(find ./ -name **.properties | awk 'NR==2{print;quit}')"

或者

vi "$(find ./ -name **.properties | sed -n '2p')"

或者

vi "$(find ./ -name **.properties | sed -n '2{p;q}')"

如果文件数量很多,则带有quit或的版本返回速度会更快一些。q

答案2

find . -name \*.properties | xargs -d '\n' vi

将在单个vi实例中打开所有文件。要仅打开第一个文件,请使用

find . -name \*.properties | head -1 | xargs -d '\n' vi

答案3

如果你将 shell 更改为 zsh,那么你需要的find次数就会少很多,因为 zsh 允许你find通过通配符来完成大部分操作。首先,**/具有特殊含义:递归**/foo扩展到当前目录及其子目录中调用的文件foo,即它匹配与相同的文件find . -name foo。因此,你可以使用

vi **/*.properties

从 bash 4.0 开始,如果您输入shopt -s globstar~/.bashrc**/行为方式相同。

在 zsh 中,由于有了 glob 限定符(在文章末尾有非常简洁的描述),你拥有更多的可能性。zshexpn手册页)。其原理是在匹配项后用括号添加一个或多个限定符来限制匹配项。例如,限定符.限制为常规文件,而/限制为目录。限定符[1]只保留第一个匹配项;[1,4]保留前四个匹配项;等等。例如,要编辑第一个(按完整路径字典顺序)匹配的常规文件*.properties

vi **/*.properties(.[1])

如果您希望编辑最近修改的匹配文件,则可以使用om限定符按修改时间对匹配项进行排序(按时间增加的顺序):

vi **/*.properties(.om[1])

答案4

我想有人已经给出了答案:

查找 -name *.properties -exec vi {} \;

这将导致对通过“find -name *.properties”找到的文件进行一系列的编辑。

如果您只想打开第二个文件:

vi "$(find -name *.properties | awk ‘NR==2’)"

相关内容