通常,要删除文件名中带有空格的文件,您必须运行:
$ rm "file name"
但如果我想删除多个文件,例如:
$ find . -name "*.txt" | xargs rm
这不会删除带有空格的文件。
答案1
您可以告诉find
和xargs
都使用空终止符
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