如何用Bash脚本根据文件夹名称中的数字范围批量移动目录
可行Shell脚本方案
不需要将每行拆分到单独文件,直接逐行读取list.txt处理即可,脚本自带容错逻辑,可适配动态变动的目录数量。
实现逻辑
- 逐行读取路径,兼容路径带空格、特殊字符、文件末尾无换行符的场景
- 定向提取
_1/前的4位数字,避免路径其他位置的下划线、特殊字符干扰提取结果 - 自动计算所属目标目录编号,无需提前创建所有目录,脚本自动生成缺失的目标目录
- 内置校验逻辑,非法路径直接跳过不会执行错误操作
完整可运行脚本
#!/bin/bash # 按需修改以下3个配置项即可使用 LIST_FILE="./list.txt" # 你的路径列表文件路径 TARGET_PARENT="/opt/target_dir" # 存放folder1、folder2的上级目录路径 INTERVAL=500 # 每个目录对应的数字区间大小,可自行调整 while IFS= read -r dir_path || [[ -n "$dir_path" ]]; do # 跳过空行 [[ -z "$dir_path" ]] && continue # 提取_1/前的4位数字,规则匹配你的路径样例 target_num=$(echo "$dir_path" | grep -oE '[0-9]{4}_1/$' | cut -d '_' -f1) # 校验是否提取到合法4位数字 if ! [[ "$target_num" =~ ^[0-9]{4}$ ]]; then echo "跳过非法路径:$dir_path,未提取到有效目标数字" >&2 continue fi # 计算目标folder编号,10#前缀避免0开头的数字被识别为八进制 folder_id=$(( (10#$target_num -1)/INTERVAL +1 )) final_target="${TARGET_PARENT}/folder${folder_id}" # 目标目录不存在自动创建 mkdir -p "$final_target" # 执行移动,-n参数避免覆盖已有同名目录,不需要可删除 mv -n "$dir_path" "$final_target/" done < "$LIST_FILE"
测试建议
正式执行前可先将脚本中的mv命令替换为echo mv,先跑一遍预览所有移动操作是否符合预期,确认无误后再换回mv执行实际移动:
echo mv -n "$dir_path" "$final_target/"
内容的提问来源于stack exchange,提问作者user2377521
相关产品推荐
相关产品推荐

