使用“find -name”命令并结合“xargs”命令会导致带有空格的文件名无法传递给命令。

通常,要删除文件名中带有空格的文件,您需要运行以下命令:
$ rm "file name"

但是如果我想要删除多个文件,例如:
$ find . -name "*.txt" | xargs rm

这不会删除文件名中有空格的文件。

这里完全猜测:find -name "*\ *.txt" | xargs rm 能用于删除两个单词文件吗? - TheWanderer
1可能是如何在目录名称中存在空格时使用find命令?的重复问题。还可以参考如何避免文件名中的空格?文件名中的空格问题 - Scott - Слава Україні
3个回答

你可以告诉findxargs同时使用空终止符。
find . -name "*.txt" -print0 | xargs -0 rm

或者(更简单地),使用find的内置-delete动作。
find . -name "*.txt" -delete

或者(感谢@kos)
find . -name "*.txt" -exec rm {} +

任一种都应该在不需要 xargs 的情况下尊重系统的 ARG_MAX 限制。


1虽然你提到了ARG_MAX,但是不能给它点赞两次哦 :) 我也要提一下,find . -name "*.txt" -exec rm {} \; 是一个“安全的尝试”。 - kos
3大师说:永远记住 xargs -0。 - Joshua
1非常重要的一点:-print0 必须是最后一个选项(或者至少在 -name "*.txt" 之后),否则这将会匹配到不仅限于 *.txt 的文件... - Kev

xargs命令默认使用制表符、空格和换行符作为分隔符。你可以通过-d选项告诉它只使用换行字符('\n'): find . -name "*.txt" | xargs -d '\n' rm 原回答来源于SO.

顺便提一下,如果你使用的不是find命令,你可以使用tr命令将换行符替换为空字节。

例如,下面这个一行命令可以删除目录中最后修改的10个文件,即使它们的文件名中有空格。

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