Harimbola Santatra Asked: 2025-01-19 15:20:09 +0800 CST2025-01-19 15:20:09 +0800 CST 2025-01-19 15:20:09 +0800 CST 使用 vim 查找包含空格的文件 772 我有一个文件,其名称中包含空格:my file.txt。 如果我想找到具有此名称的文件并使用 将其输出通过管道传输到 vim args,则我必须使用--null|-0才能正确处理空格: find . -iname "my*file.txt" | xargs --null vim 问题是传递给命令的文件名是my file.txt^@。 是vim 中的空字符^@。 那么我怎样才能将my file.txt文件从findvimfzf传递出去? find 2 个回答 Voted Best Answer terdon 2025-01-19T23:03:34+08:002025-01-19T23:03:34+08:00 通常情况下,您不需要。我的意思是,您可以尝试使用-print0,然后-0使用xargs,但为什么呢?只需使用专为此类事情设计find的选项即可。来自:-execman find -exec 命令; 执行命令;如果返回 0 状态则为 true。所有要查找的后续参数都被视为命令的参数,直到;遇到由 组成的参数。 因此您只需执行以下操作即可打开一个文件: find . -iname 'my*file.txt' -exec vim {} \; 或者,如果您有多个匹配的文件并且想要打开它们全部: -exec 命令 {} + -exec 操作的这一变体对选定的文件运行指定的命令,但命令行是通过在末尾附加每个选定文件名来构建的;命令的总调用次数将远少于匹配文件的数量。命令行的构建方式与 xargs 构建其命令行的方式大致相同。 对于你来说,它看起来应该是这样的: find . -iname 'my*file.txt' -exec vim {} + 如果你必须使用xargs,并且xargs碰巧是来自 GNU findutils 的,来自支持 Korn 风格进程替换的 shell,那么等效的操作将如下所示: xargs -r0a <(find . -iname 'my*file.txt' -print0) vim 在哪里: 我们用它-print0来匹配所期望的格式xargs -0(的标准等价物xargs --null)。 如果没有匹配的文件,我们会-r避免不带参数运行。vim 我们将列表作为文件(这里是一种命名管道)参数传递-a而不是xargsstdin,以保留vim的 stdin。 Harimbola Santatra 2025-01-19T15:20:09+08:002025-01-19T15:20:09+08:00 find的分隔符默认为换行符\n。 从手册页中: -print 正确;在标准输出上打印完整的文件名,后跟换行符。(...) 因此你必须 告诉xargs使用\n作为分隔符: find . -iname "my*file.txt" | xargs -d "\n" vim 或者告诉find使用null字符作为分隔符: find . -iname "my*file.txt" -print0 | xargs --null vim 再次,从手册页中: -print0 True;在标准输出上打印完整文件名,后跟一个空字符(而不是使用的换行符-print)。这允许处理 find 输出的程序正确解释包含换行符或其他类型空格的文件名。此选项对应于-0的选项xargs。
通常情况下,您不需要。我的意思是,您可以尝试使用
-print0
,然后-0
使用xargs
,但为什么呢?只需使用专为此类事情设计find
的选项即可。来自:-exec
man find
因此您只需执行以下操作即可打开一个文件:
或者,如果您有多个匹配的文件并且想要打开它们全部:
对于你来说,它看起来应该是这样的:
如果你必须使用
xargs
,并且xargs
碰巧是来自 GNU findutils 的,来自支持 Korn 风格进程替换的 shell,那么等效的操作将如下所示:在哪里:
-print0
来匹配所期望的格式xargs -0
(的标准等价物xargs --null
)。-r
避免不带参数运行。vim
-a
而不是xargs
stdin,以保留vim
的 stdin。find
的分隔符默认为换行符\n
。从手册页中:
因此你必须
xargs
使用\n
作为分隔符:find
使用null
字符作为分隔符:再次,从手册页中: