我正在运行命令
ls *my_file.txt* | xargs vim
shell会抛出一条警告消息:
Vim: Warning: Input is not from a terminal
然后打开文件。请注意,* my_file.txt *只有一个实例。在退出文件时,我看到在每个ENTER上,提示不在下一行,而是在同一行继续。字符不会在显示屏上键入,而是在后续输入时进行缓冲和执行。基本上,显示器出错了。
意图基本上是将搜索到的file_name传递给vim。所以欢迎任何替代解决方案。
答案 0 :(得分:3)
使用find
和exec
代替xargs
。
find /search/path/ -type f -name "*my_file.txt*" -exec vim {} \;
您可以向find
添加更多选项,例如-depth
以限制递归遍历,-regex
复杂正则表达式以查找文件等。
答案 1 :(得分:3)
我完全不确定我明白你在做什么。如果您只想编辑所有*my_file.txt*
文件,请使用:
vim *my_file.txt*
无需与find
或xargs
混淆。您遇到的唯一问题是,如果您拥有该表单的大量文件,那么您将破坏命令行的限制。但是,说真的,你可能不想编辑那么多文件。
根据此讨论here,vim
不是您可以轻松使用其标准输入和输出的程序之一(至少在vi模式下 - ex模式可能不同)。< / p>
您可以通过以下方式看到类似的问题:
`vi filename`
$(vi filename)
vi filename </dev/null
基本上,vim
并不意味着它的标准输入/标准输出,它是一个交互式编辑器,并期望一个终端设备。您看到的后果可能是curses
或vim
本身未正确清理stty
设置。
如果您有更多复杂命令生成用于编辑的文件名,您可以使用以下内容:
vim $(arbitrarily_bizarre_command_which_outputs_filenames)
请记住,输出是简单的文本替换,因此不会轻易处理像my list of porn sites.txt
这样的文件(其中包含空格)。 vim
会将其视为五个不同的论点。
答案 2 :(得分:2)
“ls my_file.txt * | vim - ”(注意末尾的破折号)
不知道如何在bsd上执行此操作。
答案 3 :(得分:1)
“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 *)
如果输出符合命令行参数的最大长度。
答案 4 :(得分:0)
另一种解决方案:
ls *my_file.txt*
vim $(!!)
!!将重复之前执行的命令,$()将在命令行中插入命令输出。
小心:不适用于包含空格或其他令人讨厌的字符的文件名。