管道查找-name到xargs会导致文件名中没有传递给命令的空格
通常要删除文件名中包含空格的文件,您必须运行:
$ rm "file name"
但如果我想删除多个文件,例如:
$ find . -name "*.txt" | xargs rm
这不会删除包含空格的文件。
您可以告诉find
和xargs
都使用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的来源答案 。