如何让Bash循环忽略空目录?寻求更简洁实现方案
简洁实现Bash循环忽略空二级子目录并处理.py文件
需求:遍历所有二级子目录,将其中的.py文件移动到上级目录,随后删除该子目录,同时跳过空目录。以下是更简洁的实现方案:
方案1:改进原循环(无需目录切换)
原代码的cd操作可以省略,直接通过路径操作完成文件移动,同时简化空目录判断逻辑:
# 开启nullglob和dotglob,确保空目录匹配时返回空,且包含隐藏文件 shopt -s nullglob dotglob for dir in */*/; do # 用数组存储目录内的所有文件,判断是否为空 local files=("$dir"/*) (( ${#files[@]} == 0 )) && continue # 移动.py文件到上级目录 mv "$dir"/*.py "$dir/.." # 删除该二级子目录 rm -r "$dir" done # 恢复默认选项(可选,避免影响后续脚本) shopt -u nullglob dotglob
优化点:
- 去掉冗余的
cd/cd -操作,直接通过路径引用文件,避免目录切换带来的潜在问题 - 用数组存储目录内容,判断空目录的逻辑更直观可靠
- 提前设置
nullglob和dotglob,确保空目录的判断准确(不会出现$dir/*原样输出的情况)
方案2:用find命令一键完成
如果追求极致简洁,可以用find命令直接筛选非空二级子目录并执行处理逻辑:
find */* -type d -not -empty -exec sh -c ' for dir do mv "$dir"/*.py "$dir/.." rm -r "$dir" done ' sh {} +
说明:
*/*:匹配所有二级子目录-type d:只筛选目录-not -empty:排除空目录-exec sh -c '...' sh {} +:批量将符合条件的目录传入脚本处理,效率更高
内容的提问来源于stack exchange,提问作者ThomasAllen
相关产品推荐
相关产品推荐

