Linux xargs以管道方式输出ls命令

Linux xargs以管道方式输出ls命令,linux,xargs,ls,Linux,Xargs,Ls,我正在执行命令 ls *my_file.txt* | xargs vim shell将抛出一条警告消息: Vim: Warning: Input is not from a terminal 然后打开文件。请注意,只有一个*my_file.txt*实例。在退出文件时,我看到每次输入时,提示不在下一行,而是在同一行继续。字符不会在显示屏上键入,但会在后续输入时缓冲并执行。基本上,显示会出错 其目的基本上是通过管道将搜索到的文件名传递给vim。因此,欢迎使用任何替代解决方案。使用find和exe

我正在执行命令

ls *my_file.txt* | xargs vim
shell将抛出一条警告消息:

Vim: Warning: Input is not from a terminal
然后打开文件。请注意,只有一个*my_file.txt*实例。在退出文件时,我看到每次输入时,提示不在下一行,而是在同一行继续。字符不会在显示屏上键入,但会在后续输入时缓冲并执行。基本上,显示会出错


其目的基本上是通过管道将搜索到的文件名传递给vim。因此,欢迎使用任何替代解决方案。

使用
find
exec
而不是
xargs

find /search/path/ -type f -name "*my_file.txt*" -exec vim {} \;
您可以在
find
中添加更多选项,如
-depth
以限制递归遍历,
-regex
用于查找文件等的复杂正则表达式。

我不完全确定我是否理解您在做什么。如果您只想编辑所有
*my_file.txt*
文件,请使用:

vim *my_file.txt*
无需乱动
find
xargs
。唯一的问题是,如果您有那么多这种格式的文件,您将突破命令行的限制。但是,说真的,你可能无论如何都不想编辑那么多文件

根据本文的讨论,
vim
不是可以轻松使用其标准输入和输出的程序之一(至少在vi模式下-ex模式可能不同)

您可以看到类似的问题,例如:

`vi filename`
$(vi filename)
vi filename </dev/null
请记住,输出是简单的文本替换,因此无法轻松处理像
我的色情网站列表.txt这样的文件(其中包含空格)
vim
将其视为五个不同的参数。

“ls my_file.txt*|vim-”(注意末尾的破折号)

但不知道如何在bsd上执行此操作

“ls my_file.txt*| vim…”

在bash中不起作用,因为vim将其视为文件内容而不是文件名

find/search/path/-type f-name“*my_file.txt*”-exec vim{}\

请注意,这将一次编辑一个文件。如果仍要编辑不同缓冲区中的多个文件,则仍应使用

ls*my_file.txt*| xargs vim

vim$(ls*my_file.txt*)

如果输出符合命令行参数的最大长度。

另一种解决方案:

ls *my_file.txt*
vim $(!!)
!!将重复之前执行的命令,$()将在命令行中插入命令输出


小心:不适用于包含空格或其他讨厌字符的文件名。

如果my_file.txt只有一个实例,为什么不直接执行
vim my_file.txt
?ls my_file.txt的思想是从文件列表中获取单个文件名。我知道这个模式搜索将生成一个结果。结果文件名将在vim中编辑/查看,通过管道输出将两个命令合并为一个命令。
ls *my_file.txt*
vim $(!!)