如何通过脚本删除文件夹内除特定子文件夹外的所有子文件夹并避免误删主目录?
嘿,这个问题我之前也碰到过!核心原因就是你的命令没精准限定操作范围,不小心把主目录也包含进去了。给你几个安全可靠的解决办法:
方案1:用
find命令精准筛选(推荐) find命令可以帮你精准定位到目标目录下的子文件夹,完全避开主目录本身。假设你要保留的文件夹是test2,主目录是/path/to/myfolder,可以这么写:
find /path/to/myfolder -maxdepth 1 -type d ! -name "myfolder" ! -name "test2" -exec rm -rf {} +
这里的关键参数得解释下:
-maxdepth 1:只查找myfolder下的一级子目录,不会深入到子文件夹内部-type d:只匹配文件夹,不会碰文件! -name "myfolder":强制排除主文件夹(因为find默认会把目标目录本身也列出来)! -name "test2":排除你要保留的当日文件夹-exec rm -rf {} +:对所有匹配到的文件夹执行删除
方案2:用Shell循环,逻辑更直观
如果你觉得find有点绕,用Shell循环的方式更易懂,也更安全:
#!/bin/bash # 配置你的目标目录和要保留的文件夹 TARGET_DIR="/path/to/myfolder" KEEP_FOLDER="test2" # 遍历目标目录下的所有子文件夹(末尾的/确保只匹配文件夹) for dir in "$TARGET_DIR"/*/; do # 提取文件夹的纯名称(去掉路径) dir_name=$(basename "$dir") # 只删除非保留的文件夹 if [ "$dir_name" != "$KEEP_FOLDER" ]; then rm -rf "$dir" fi done
这里的"$TARGET_DIR"/*/会自动匹配所有子文件夹,绝对不会触碰到myfolder本身,逻辑一目了然。
必看的安全提示
- 先测试再执行!在真正删除前,把
rm -rf换成echo,看看输出的是不是你要删的文件夹,比如:
确认无误后再替换成find /path/to/myfolder -maxdepth 1 -type d ! -name "myfolder" ! -name "test2" -exec echo {} +rm -rf,避免误删重要内容。 - 脚本里尽量用绝对路径,不要用相对路径,防止切换工作目录后出错。
- 如果要保留的文件夹是按日期命名的(比如
20240520),可以用date命令自动生成名称,让脚本自动化:
这样每天运行脚本时,会自动保留当天日期命名的文件夹。KEEP_FOLDER=$(date +%Y%m%d)
内容的提问来源于stack exchange,提问作者Riju Mahna
相关产品推荐
相关产品推荐

