如何用Bash/Shell脚本移除两级子目录并保留嵌套数据
批量移除指定嵌套层级并迁移文件的Shell方案
脚本实现
以下脚本可以批量处理folder1下所有符合结构的文件,移除date_to=和sys_date_from=两级目录,并将文件迁移到对应的父目录,同时保留其他结构:
#!/bin/bash # 替换为实际的folder1路径 ROOT_DIR="./folder1" # 定位所有需要迁移的文件 find "$ROOT_DIR" -type f -path "*/date_to=*/sys_date_from=*" | while read -r file_path; do # 移除路径中的date_to和sys_date_from两级目录 target_path=$(echo "$file_path" | sed -E 's/\/date_to=[^\/]+\/sys_date_from=[^\/]+//') # 创建目标目录(确保不存在时自动生成) target_dir=$(dirname "$target_path") mkdir -p "$target_dir" # 移动文件(-v参数用于显示操作过程,方便验证) mv -v "$file_path" "$target_path" done # 可选:清理空的date_to和sys_date_from目录 find "$ROOT_DIR" -type d \( -name "date_to=*" -o -name "sys_date_from=*" \) | sort -r | while read -r dir_path; do if [ -z "$(ls -A "$dir_path")" ]; then rmdir -v "$dir_path" fi done
工作原理
- 文件定位:通过
find命令匹配所有包含date_to=*/sys_date_from=*层级的文件,确保只处理需要迁移的目标文件。 - 路径转换:用
sed正则表达式直接替换路径中/date_to=[^/]+/sys_date_from=[^/]+这段内容——[^/]+匹配任意非路径分隔符的字符,完美适配动态变化的目录值(比如date_to=2023-10-12或sys_date_from=12%1A22%3A19.489)。 - 目录创建:
mkdir -p确保目标目录存在,避免移动文件时因目录缺失报错。 - 空目录清理:可选步骤通过
sort -r先删除子目录(sys_date_from=*)再删除父目录(date_to=*),只清理空目录,避免误删有残留文件的目录。
注意事项
- 先验证再执行:可以将
mv -v改为echo mv -v,先打印所有要执行的移动命令,确认路径转换正确后再实际执行。 - 处理特殊字符:脚本中用
read -r和双引号包裹所有路径变量,支持路径中的空格、百分号等特殊字符(如示例中的sys_date_to=8888-12-31 23%3A59%3A59.999)。 - 数据备份:执行前建议备份目标目录数据,避免意外操作导致数据丢失。
内容的提问来源于stack exchange,提问作者user2441441
相关产品推荐
相关产品推荐

