现在我们都熟悉不使用:
find . -print | xargs cmd
但使用
find . -print0 | xargs -0 cmd
为了处理包含例如换行符的文件名,但是我在脚本中的一行呢:
find $@ -type f -print | while read filename
好吧,我认为它会是这样的:
find $@ -type f -print0 | while read -d"\0" filename
如果我只是这样做:
find $@ -type f -print0 | while read filename
我会看到NULL吗?
但是不,while循环在零次后退出(在这两种情况下)我假设是因为读取返回零,我也假设是因为它读取了一个 NULL (\0) 。
感觉 bash读取应该带有“-0”选项。
我是否误读了正在发生的事情,或者是否有不同的方式来构建它?
对于这个例子,我可能不得不重新编码以使用 xargs ,但这是我不想分叉的一大堆新进程。
使用时
read
,您可以使用 just-d ''
来读取下一个空字符。从
bash
手册中,关于read
内置实用程序:您可能还希望设置
IFS
为空字符串以停止read
从数据中修剪侧翼空格,并使用read
with-r
能够正确读取包含反斜杠的字符串。$@
如果您希望您的脚本或 shell 函数支持包含换行符、空格、文件名通配符等的搜索路径,您还需要对扩展进行双引号:就个人而言,如果不是迫切需要,我根本不会传递路径名
find
,而是通过执行所需的操作-exec
,例如,相关话题: