使用xargs命令将ls命令的输出传递给管道

5
我正在运行命令。
ls *my_file.txt* | xargs vim

Shell会抛出一个警告信息:

Vim: Warning: Input is not from a terminal

文件打开后,注意只有一个 *my_file.txt* 的实例。退出文件时,我发现每次按 ENTER 键时,提示符并不在下一行,而是继续在同一行上。字符没有在显示器上输入,而是被缓冲并在后续的 ENTER 键上执行。基本上,显示器出现了问题。

目的基本上是将搜索到的 file_name 管道传输到 vim。因此,任何替代方案都欢迎。


如果my_file.txt只有一个实例,为什么不直接执行vim my_file.txt呢? - Neilvert Noval
ls my_file.txt 的想法是从文件列表中获取单个文件名。我知道这种模式搜索将生成单个结果。生成的文件名将在vim中进行编辑/查看,通过将输出进行管道传递来将两个命令组合成一个命令。 - Sachin Shetye
5个回答

6

使用findexec代替xargs

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

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


2

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

但我不确定如何在BSD上执行此操作。


2

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

vim *my_file.txt*

不需要使用“find”或“xargs”。唯一的问题是,如果您有太多这种形式的文件,可能会超出命令行的限制。但是,说真的,您可能也不想编辑那么多文件。
根据此处的讨论,vim不是那些可以轻松处理其标准输入和输出的程序之一(至少在vi模式下 - ex模式可能不同)。
您可以看到类似的问题,比如:
`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会将其视为五个不同的参数。


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*)”,前提是输出符合命令行参数最大长度。

0

另一种解决方案:

ls *my_file.txt*
vim $(!!)

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

注意:不适用于包含空格或其他特殊字符的文件名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接