将 find -name 管道传输到 xargs 会导致带有空格的文件名不会传递给命令

将 find -name 管道传输到 xargs 会导致带有空格的文件名不会传递给命令

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

$ rm "file name"

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

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

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

答案1

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

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

或者(更简单)使用内置-delete操作find

find . -name "*.txt" -delete

或者(感谢@kos)

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

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

答案2

顺便说一句,如果您使用了 find 以外的其他工具,则可以使用 tr 将换行符替换为空字节。

例如,下面的一行程序将删除目录中最后修改的 10 个文件,即使它们的名称中有空格。

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

答案3

xargs 命令默认使用制表符、空格和换行符作为分隔符。您可以使用 -d 选项告诉它仅使用换行符 ('\n'):

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

SO 上的源答案

相关内容