将find -name管道传递给xargs会导致文件名中的空格未传递给命令


26

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

$ rm "file name"

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

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

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


在这里完整的猜测:是否find -name "*\ *.txt" | xargs rm适用于两个Word文件?
TheWanderer

Answers:


48

您可以告诉find并且xargs都使用空终止符

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

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

find . -name "*.txt" -delete

或(感谢@kos)

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

两者中的任何一个都应遵守系统的ARG_MAX限制,而无需xargs


1
不能两次艰难地对它进行投票:),因为您提到了ARG_MAX我还要提到那find . -name "*.txt" -exec rm {} \;将是一个“安全击球”
kos 2015年

3
因此,对主人说:永远记住xargs -0。
2015年

1
超级重要的一点:-print0必须是最后一个选项(或至少在之后-name "*.txt"),否则这将使文件不再局限于*.txt ...
Kev

1

顺便说一句,如果您使用的不是find,则可以使用tr将换行符替换为空字节。

例如。即使文件名中有空格,下面的划线员也会删除目录中的最后10个修改的文件。

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


是的,这有效。
Peter Mortensen '18

0

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

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

关于SO的源答案


这个问题的答案提到-0的,而不是-d(对xargs)的BSD系统。Ubuntu使用什么?此处接受的答案使用-0。什么是正确的?
彼得·莫滕森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.