我发现自己经常做的事情是运行find命令,然后在vi中编辑所有命令,如下所示:
> find . "*.txt"
./file1.txt
./file2.txt
./path/to/file3.txt
> vi ./file1.txt ./file2.txt ./path/to/file3.txt
有一个聪明而简单的方法可以在一个命令行中完成所有这些操作吗?
xargs
破坏我的外壳终端。正确的解决方案是@DevSolar提供的解决方案
我发现自己经常做的事情是运行find命令,然后在vi中编辑所有命令,如下所示:
> find . "*.txt"
./file1.txt
./file2.txt
./path/to/file3.txt
> vi ./file1.txt ./file2.txt ./path/to/file3.txt
有一个聪明而简单的方法可以在一个命令行中完成所有这些操作吗?
xargs
破坏我的外壳终端。正确的解决方案是@DevSolar提供的解决方案
Answers:
这应该可以解决问题:
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在下面的评论中解释了原因,并在此问题中进行了更多解释。
/dev/tty
并调用ioctl();这样做太懒了。)当被xargs调用时,vim接收/dev/null
作为其标准输入,它只是忽略了终端控制ioctl。
vim -p
如果需要文件选项卡。(gt
以及gT
进行导航或单击鼠标。)
vim
,只需将指定-
为第一个参数,如中所示echo foobar | vim -
。
find . -name "*.txt" | vim -
在未命名的文件上给您一个vim会话,其中包含找到的文件的名称,这不是OP要求的...
另外,如果您希望它们一次打开一个,则还可以使用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
-name
缺少而返回当前目录。第二点:文件名中包含空格后,该命令将失败,失败。-1为不明智的答案。
要全部编辑*.txt
,只需运行:vim *.txt
。要编辑所返回的文件find
,请进一步阅读。
在Unix / macOS上,您可以使用find
BSD xargs
(请参阅:)man xargs
,例如
find -L . -name "*.txt" -type f -print0 | xargs -o -0 vim
-o
(xargs
):在执行命令之前,在子进程中以/ dev / tty的身份重新打开标准输入。
相关:在Vim.SE上使用xargs调用Vim后,终端出现故障。