我有许多名为“test”的目录,我想删除它们。
我知道如何找到它们并使用以下方法打印它们:
find . -name test -print
现在,我该如何删除目录?
请注意,我的目录中也有文件,也必须删除它们。
答案1
xargs
发挥所有魔力:
find . -name test -type d -print0|xargs -0 rm -r --
xargs
执行作为参数传递的命令,并将参数传递给 stdin。
这是使用rm -r
删除该目录及其所有子目录。
这--
表示参数的结束,以避免以 开头的路径-
被视为参数。
-print0
告诉find
打印\0
字符而不是换行符;并-0
告诉xargs
仅将其视为\0
参数分隔符。
这是一次调用多个目录,避免了每个目录单独rm
调用的开销。rm
另外,find
也可以为每个已选择文件:
find . -name test -type d -exec rm -r {} \;
这个性能更好,因为它会rm
调用一次可同时访问多个目录:
find . -name test -type d -exec rm -r {} +
(请注意+
最后的;这个相当于xargs
解决方案。)
答案2
find /path/to/dir -name "test" -type d -delete
-姓名:查找传递的名称。您可以使用
-regex
基于正则表达式提供名称-类型:查找文件类型。
d
仅查找目录-删除:删除找到的列表的操作。
或者:
find /path/to/dir -name "test" -type d -exec rm -rf {} \;
作为JF塞巴斯蒂安评论中指出:
您可以使用+
而不是\;
来一次传递多个目录。
答案3
另一种方法是
find . -name test -exec rm -R "{}" \;
关于 find 的一个有用链接:http://www.softpanorama.info/Tools/Find/using_exec_option_and_xargs_in_find.shtml
答案4
假设 bash 4+
shopt -s globstar
rm -r ./**/test/
尾部斜杠表示它只匹配目录。事先进行测试:
printf '%s\n' ./**/test/