Unix 删除目录中所有指定名称的文件夹

4

你好,我有很多名为“@eaDir”的文件夹分布在我的一个磁盘上,我想搜索并删除它们及其内容。

我知道这可能需要结合使用find和rm命令,但我不太确定如何操作。有人能帮忙吗?

3个回答

4

试试这个:

find . -type d -name '@eaDir' -print0 | xargs -rt0 rm -rv

以下是使用xargs的显式长选项的相同内容:

find . -type d -name '@eaDir' -print0 | xargs --no-run-if-empty --verbose --null rm -rv

如果你要编写需要维护/审核的脚本,使用长选项是个好主意。

但在此之前:

man find
man xargs

为什么使用非标准参数来查找, find . -type d -name '@eaDir' -exec rm -rv {} \; 是可以的,不是吗? - jfg956
是的,这也可以。不同之处在于,使用-exec选项时,find将为找到的每个目录生成一个rm进程。使用xargs,将构建rm -rv的参数列表,然后一次性调用rm -rv [argument list here] - dschulz

1
find /path/to/the/disk -type d -name "@eaDir" -delete

请注意,这里的顺序是基本的:引用手册页,

警告:不要忘记find命令行被评估为一个表达式,因此将-delete放在第一位会使find尝试删除您指定的起始点以下的所有内容。

所以,像往常一样,首先使用-print测试您的find命令,然后在检查一切正常后,将其替换为-delete。请注意,-delete意味着-depth,因此,为了进行有意义的-print测试,您应该在表达式中明确指定它:

当测试一个find命令行,您之后打算使用-delete时,应该明确指定-depth,以避免后来的惊喜。


没错,但我会谨慎使用和推荐 -delete。如果放错位置或顺序,它有可能引发灾难。 - dschulz
1
@dschulz:是的,这里的顺序很重要,如果你把它放在“-name”之前,它会欣然删除指定根目录下的所有内容。另一方面,关于大规模删除和Shell脚本编写的常规规则也适用于此:首先使用“-print”(echo)进行测试,然后再将“-delete”(rm)放到其位置。 - Matteo Italia

0

前往根目录或文件夹并执行以下命令:

find . -path '*/@eaDir/*' -delete -print && find . -path '*/@eaDir' -delete -print

这应该对你有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接