删除当前目录下所有文件夹(含内容)但保留文件及解决find命令参数错误
删除当前目录下所有文件夹(含内容)但保留文件及解决find命令参数错误
嘿,我来帮你搞定这个问题!你想要删除当前目录下的所有直接子文件夹(包括里面的所有内容),但保留当前目录里的文件对吧?咱们先把正确的命令搞定,再说说你刚才遇到的报错原因。
正确实现需求的方法
这里有两种靠谱的方式:
方法1:完善后的find命令
你之前的find命令差了关键的收尾标记,正确的写法是:
find . -mindepth 1 -maxdepth 1 -type d -exec rm -r {} \;
或者用更高效的版本(一次性把所有目录传给rm,减少进程创建次数):
find . -mindepth 1 -maxdepth 1 -type d -exec rm -r {} +
我给你拆解下每个参数的作用:
.:明确指定当前目录作为查找起点(其实省略也能工作,但加上更清晰)-mindepth 1:跳过当前目录本身,避免误操作-maxdepth 1:只查找当前目录下的直接子文件夹,不会深入到子文件夹的子文件夹里-type d:只匹配目录类型的项-exec rm -r {} \;:对每个找到的目录执行rm -r删除操作,{}代表找到的目录路径,\;是-exec的必须结束标记(这就是你报错的核心原因)
方法2:更简洁的bash glob命令
如果你的shell是bash(大部分Linux系统默认都是),可以用更简单的命令:
rm -r */
*/是bash的通配符,会匹配当前目录下所有以/结尾的项——也就是所有直接子文件夹。不过要注意:如果当前目录没有任何子文件夹,这个命令会抛出rm: cannot remove '*/': No such file or directory的错误,但这不影响正常使用,有文件夹的时候会正常删除。
你遇到的报错原因
你之前输入的命令find -mindepth 1 -maxdepth 1 -type d -exec rm -r {}会触发find: missing argument to -exec'错误,是因为-exec选项需要明确的结束标记:要么用;表示对每个找到的项单独执行命令,要么用+表示把所有找到的项一次性传给命令。你没加这个标记,find就不知道什么时候结束-exec`的参数列表,所以报错了。
备注:内容来源于stack exchange,提问作者Anon




