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


27

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

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

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

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


1
您可以将其传送到vi:find中。“ * .txt” | xargs vi
MaQleod

1
@MaQleod:从技术上讲,它将管道传递给xargs
grawity 2011年


用管道xargs破坏我的外壳终端。正确的解决方案是@DevSolar提供的解决方案
typelogic

Answers:


41

这应该可以解决问题:

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,再加上一个完全伪造的终端。用户grawity在下面的评论中解释了原因,并在此问题中进行了更多解释。


4
不知道您对vim有多少了解,但我花了/ forever /才知道:n显示下一个文件,:N显示前一个文件。
zpletan 2011年

4
@DevSolar:Vim期望其stdin与其控制终端相同,并直接在stdin上执行各种与终端相关的ioctl。(您可能会认为这是一个错误。Vim当然可以打开/dev/tty并调用ioctl();这样做太懒了。)当被xargs调用时,vim接收/dev/null作为其标准输入,它只是忽略了终端控制ioctl。
grawity 2011年

3
@zpletan:vim -p如果需要文件选项卡。(gt以及gT进行导航或单击鼠标。)
grawity 2011年

2
仅供参考,为避免管道输送时出现警告vim,只需将指定-为第一个参数,如中所示echo foobar | vim -
康拉德·鲁道夫

2
@Konrad Rudolph:find . -name "*.txt" | vim -在未命名的文件上给您一个vim会话,其中包含找到的文件的名称,这不是OP要求的...
DevSolar 2011年


1

另外,如果您希望它们一次打开一个,则还可以使用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

...但是您为什么要这么做?
DevSolar 2011年

@DevSolar第一个是指出find的功能,第二个是通用循环。也许您想在编辑每个文件之前对其进行处理。
OldWolf 2011年

您是否尝试过第二次?第一:查找由于-name缺少而返回当前目录。第二点:文件名中包含空格后,该命令将失败,失败。-1为不明智的答案。
2011年

实际上,文件名中的空格主题也适用于我的答案。我什至无法想到一种正确处理它们的方法,而无需将其从命令行转换成自己的小脚本。不建议使用文件名中的空格是有充分理由的。
DevSolar 2011年

@ceving有效点。我以为原来的海报能满足他的需求。编辑。
OldWolf 2011年

0

如果您已经输入了find命令,我发现使用它可以更轻松xargs地打开搜索结果:

find . -name "*.txt" | xargs vim -p

-p选项告诉vim在新选项卡中打开每个文件。我发现这比仅使用缓冲区更方便,但是如果您不这样做,则不要选择该选项。


谢谢,我将其连接以查找,所以我的命令是:xargs vim -p
talsibony

0

要全部编辑*.txt,只需运行:vim *.txt。要编辑所返回的文件find,请进一步阅读。


在Unix / macOS上,您可以使用findBSD xargs(请参阅:)man xargs,例如

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

-oxargs):在执行命令之前,在子进程中以/ dev / tty的身份重新打开标准输入。

相关:在Vim.SE上使用xargs调用Vim后,终端出现故障。

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.