我通常使用下面的命令行来删除文件系统上的目录。但是,第一次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 的命令行上用尽空间,但它会遭受同样的问题,即它无用地搜索要删除的文件,而这些文件无论如何肯定会被删除。