Linux 命令删除带有空格的目录

Linux 命令删除带有空格的目录

我通常使用下面的命令行来删除文件系统上的目录。但是,第一次find返回的名称带有空格,并且rm无法识别。

find . -name .AppleDouble* -exec rm -rf {} \;

它引发以下错误:find: './Aerosmith/Young Lust/.AppleDouble': No such file or directory

是否可以使用像这样的一行代码来实现它?还是我应该使用某种脚本?如果脚本是解决方案,请问您能发布一个例子吗?

答案1

你要

find <whatever> -print0 | xargs -0 rm -rf

答案2

与人们最初认为的问题相反,您遇到的问题不是文件名中的空格。 {}将正确地将文件名传递给 rm。您遇到的问题是find,默认情况下是宽度优先,而不是深度优先。 find不知道rm命令在做什么,所以在您之后rm,find 会尝试 cd 进入您刚刚删除的目录,然后您会收到文件未找到错误,因为它尝试 cd 进入的目录已经不存在了。

@womble 的答案之所以有效,是因为它延迟了删除目录。它会先在目录中搜索其他要从目录中删除的内容。这并不有效,因为如果您无论如何都要删除整个目录,那么在目录中寻找要删除的文件是愚蠢的。

在 GNU find 中,您可以使用 -delete 操作:

find . -name .AppleDouble* -delete

并且 find 会足够聪明,去做正确的事情。

find . -name .AppleDouble* -exec rm -rf {} +

(使用 + 而不是 ; 来终止命令)相当于 @womble 使用 xargs 的命令,它将具有缓冲操作的效果,直到它扫描整个目录或在 rm 的命令行上用尽空间,但它会遭受同样的问题,即它无用地搜索要删除的文件,而这些文件无论如何肯定会被删除。

相关内容