如何在 Linux 中编辑用 vi 命令查找返回的所有文件?

如何在 Linux 中编辑用 vi 命令查找返回的所有文件?

我发现自己经常做的一件事是运行 find 命令,然后在 vi 中编辑所有这些,如下所示:

> find . "*.txt"
./file1.txt
./file2.txt
./path/to/file3.txt

> vi ./file1.txt ./file2.txt ./path/to/file3.txt

是否有一个聪明而简单的方法可以在一个命令行中完成所有操作?

答案1

这应该可以解决问题:

find . -name "*.txt" -exec vim {} + 

使用 Vim,它对你的健康更有益。:-)

经常被忽视的+选项是-exec使所有文件名(最多为行长度限制)出现在一行中,即您仍然可以打开所有文件 vim会话(通过:n下一个文件和:N上一个文件进行导航)。

每个文件都有vim -p一个文件标签。查看:help tab-page-commands更多详细信息。

vim -o将获得每个文件的水平分割窗口和vim -O垂直分割窗口。查看:help window-move-cursor更多详细信息。

请注意,此答案的先前版本vim $(find . -name "*.txt")不适用于文件名中的空格,并且存在安全隐患。

通过管道传输到终端xargs vi会产生一个Warning: Input is not from a terminal,之后会出现完全虚假的行为。用户 graity 在下面的评论中解释了原因,并在这个问题

答案2

或者运行 vim 然后从那里:

:args **/*.txt

答案3

此外,如果您希望一次打开一个,您也可以使用 find -exec 或使用简单的 for 循环。 根据 ceving 的评论进行编辑。

find . -name "*.txt" -exec vi {} \;

或者

OLDIFS=$IFS
IFS=$(echo -en "\n\b")
for i in `find . -name "*.txt"`
    do
        vi $i
    done
IFS=$OLDIFS

答案4

要编辑全部*.txt,您只需运行:vim *.txt。要编辑返回的文件find,请继续阅读。


在 Unix/macOS 上,你可以find与 BSD 一起使用xargs(参见man xargs:),例如

find -L . -name "*.txt" -type f -print0 | xargs -o -0 vim

-oxargs):执行命令之前,在子进程中将 stdin 重新打开为 /dev/tty。

有关的:使用 xargs 调用 Vim 后终端崩溃在 Vim.SE。

相关内容