xargs管道ls命令的输出

时间:2011-12-29 01:21:54

标签: linux xargs ls

我正在运行命令

ls *my_file.txt* | xargs vim

shell会抛出一条警告消息:

Vim: Warning: Input is not from a terminal

然后打开文件。请注意,* my_file.txt *只有一个实例。在退出文件时,我看到在每个ENTER上,提示不在下一行,而是在同一行继续。字符不会在显示屏上键入,而是在后续输入时进行缓冲和执行。基本上,显示器出错了。

意图基本上是将搜索到的file_name传递给vim。所以欢迎任何替代解决方案。

5 个答案:

答案 0 :(得分:3)

使用findexec代替xargs

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

您可以向find添加更多选项,例如-depth以限制递归遍历,-regex复杂正则表达式以查找文件等。

答案 1 :(得分:3)

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

vim *my_file.txt*

无需与findxargs混淆。您遇到的唯一问题是,如果您拥有该表单的大量文件,那么您将破坏命令行的限制。但是,说真的,你可能不想编辑那么多文件。

根据此讨论herevim不是您可以轻松使用其标准输入和输出的程序之一(至少在vi模式下 - ex模式可能不同)。< / p>

您可以通过以下方式看到类似的问题:

`vi filename`
$(vi filename)
vi filename </dev/null

基本上,vim并不意味着它的标准输入/标准输出,它是一个交互式编辑器,并期望一个终端设备。您看到的后果可能是cursesvim本身未正确清理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 $(!!)

!!将重复之前执行的命令,$()将在命令行中插入命令输出。

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