管道查找-name到xargs会导致文件名中没有传递给命令的空格

通常要删除文件名中包含空格的文件,您必须运行:

$ rm "file name" 

但如果我想删除多个文件,例如:

 $ find . -name "*.txt" | xargs rm 

这不会删除包含空格的文件。

您可以告诉findxargs都使用null终止符

 find . -name "*.txt" -print0 | xargs -0 rm 

或(更简单)使用find的内置-delete动作

 find . -name "*.txt" -delete 

或者(谢谢@kos)

 find . -name "*.txt" -exec rm {} + 

其中任何一个都应该尊重系统的ARG_MAX限制,而不需要xargs

顺便提一下,如果你使用了find以外的东西,你可以使用tr用空字节替换换行符。

例如。 以下一个内容删除目录中的10个最后修改过的文件,即使它们的名称中有空格。

ls -tp | grep -v / | head -n 10 | tr "\n" "\0" | xargs -0 rm

默认情况下,xargs命令使用制表符,空格和新行作为分隔符。 您可以告诉它只使用带有-d选项的换行符(’\ n’):

find . -name "*.txt" | xargs -d '\n' rm

SO的来源答案 。