我发现自己经常做的一件事是运行 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
-o
(xargs
):执行命令之前,在子进程中将 stdin 重新打开为 /dev/tty。
有关的:使用 xargs 调用 Vim 后终端崩溃在 Vim.SE。