我想将文件名传递给其他程序,但是当文件名中包含空格时,它们都会阻塞。
假设我有一个名为的文件。
foo bar
如何获得find
正确的名字?
显然我想要:
foo\ bar
要么:
"foo bar"
编辑:我不想通过xargs
,我想从中获取正确格式的字符串,find
以便可以将文件名的字符串直接传递到另一个程序。
find
格式化文件名就好了;他们每行写一个名字。(当然,如果文件名包含换行符,这是模棱两可的。)因此问题是接收端在收到空格时会“窒息”,这意味着如果您想要一个有意义的答案,则必须告诉我们接收端是什么。
find
提供一种选项来以适合shell的格式输出文件名是有意义的。通常,尽管如此,-print0
GNU find
扩展也可以在许多其他情况下正常工作,并且您应该学会在任何情况下都使用它。
ls $(command...)
不会通过来馈送列表stdin
。它将的输出$(command...)
直接放入命令行。在这种情况下,就是从c读取的shell,它将使用的当前值$IFS
来决定如何对输出进行字拆分。通常,最好使用xargs
。您不会注意到性能下降。
find -printf '"%p"\n'
将在找到的每个名称周围添加双引号,但不会在文件名中正确引用任何双引号。如果您的文件名没有任何嵌入的双引号,则可以忽略该问题:或通过管道sed 's/"/&&/g;s/^""/"/;s/""$/"/'
。如果您的文件名最终由外壳程序处理,则您可能应该使用单引号而不是双引号(否则sweet$HOME
将变成sheet/home/you
)。对于带有换行符的文件名,这仍然不是很可靠。您要如何处理这些?
-exec
带有的标志find
吗?您可以通过执行此操作-exec
而不是通过管道将其传递给其他命令来减轻此错误并使命令更有效。我的$ .02