Bash嵌套For循环结合IF语句实现保留指定.cntl文件删除其他
嘿,我帮你搞定这个删除文件的问题!你已经有了基础的变量定义,主要问题出在循环的语法和文件名空格的处理上,这里给你两种靠谱的实现方式:
方法一:用find命令直接完成(最简洁高效)
这种方法不需要嵌套循环,直接通过find的参数过滤掉要保留的文件,一步到位,还能避免文件名含空格的坑:
MY_DIR="/home/shell/" # 先确认要删除的文件列表(去掉-delete可以预览结果) find "$MY_DIR" -maxdepth 1 -type f -name "*.cntl" ! -name "test4.cntl" ! -name "test5.cntl" # 确认无误后,加上-delete执行删除 # find "$MY_DIR" -maxdepth 1 -type f -name "*.cntl" ! -name "test4.cntl" ! -name "test5.cntl" -delete
参数说明:
-maxdepth 1:只在指定目录下查找,不递归进入子目录(如果需要递归删除,去掉这个参数即可)! -name "test4.cntl":排除名为test4.cntl的文件-delete:直接删除匹配到的文件(执行前一定要先预览确认!)
方法二:修正嵌套循环的写法(更灵活)
如果你还是想用循环实现,需要修正数组存储和判断逻辑,避免空格问题和语法错误:
MY_DIR="/home/shell/" # 用数组存储所有.cntl文件,解决文件名含空格的问题 CNTL_FILE_LIST=("$MY_DIR"*.cntl) # 例外文件也用数组存储,方便后续判断 CNTL_EXCEPTION_LIST=("$MY_DIR/test4.cntl" "$MY_DIR/test5.cntl") # 遍历每个.cntl文件 for file in "${CNTL_FILE_LIST[@]}"; do # 先检查文件是否存在(避免目录里没有.cntl文件时,通配符原样输出的情况) [ -f "$file" ] || continue # 标记当前文件是否是例外 is_exception=0 # 遍历例外列表,判断是否匹配 for exception in "${CNTL_EXCEPTION_LIST[@]}"; do if [ "$file" = "$exception" ]; then is_exception=1 break fi done # 如果不是例外文件,执行删除(先echo预览,确认后再换成rm) if [ $is_exception -eq 0 ]; then echo "准备删除:$file" # rm -f "$file" fi done
注意事项:
- 所有变量引用都加双引号
"$var",防止文件名含空格时被拆分 - 先通过
echo预览要删除的文件,确认无误后再取消rm的注释 - 如果需要递归处理子目录的.cntl文件,可以用
find生成文件数组:CNTL_FILE_LIST=($(find "$MY_DIR" -type f -name "*.cntl"))
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

