提取文件名中客户编号与案件编号并实现文件批量迁移
批量生成文件迁移命令(提取客户/案件编号)
需求
- 提取客户编号:单个字母开头,后续为3-5位带/不带零填充的数字,保留原格式
- 提取案件编号:紧跟客户编号的4位数字,无则填充
0000 - 生成可直接执行的迁移命令,格式要求:
mkdir -p "/dest/客户编号/案件编号/"; cp -p "原文件完整路径" "/dest/客户编号/案件编号/原文件名"
示例文件名
A006280002.40.D7A5A.msg A006280002.41.C7E4E.msg A006280002.42.16362.msg A006280002.43.C4048.msg A12960004.1.4D6AC.xls K00976.1.81F42.pdf
现有问题
原sed命令丢失了文件的完整路径,导致cp命令无法定位源文件,无法正常执行。
修正后的命令
使用find结合sed,保留完整路径信息,同时完成编号提取与命令生成:
find . -type f -print0 | sed -zE ' s|^(.*)/([^/]+)$|\1\x00\2|; s|^([^\x00]*)\x00([a-zA-Z][0-9]{3,5})([0-9]{4})(\..*)$|mkdir -p "/dest/\2/\3/"; cp -p "\1/\2\3\4" "/dest/\2/\3/\2\3\4"|; s|^([^\x00]*)\x00([a-zA-Z][0-9]{3,5})(\..*)$|mkdir -p "/dest/\2/0000/"; cp -p "\1/\2\3" "/dest/\2/0000/\2\3"| '
命令说明
find . -type f -print0:遍历当前目录下所有文件,用\0分隔路径,避免文件名含空格、特殊字符时出现解析错误- 第一个sed替换:将完整路径拆分为目录路径和文件名两部分,用
\x00作为分隔符 - 第二个sed替换:匹配包含4位案件编号的文件名,生成对应迁移命令(客户编号为字母+3-5位数字,后续4位为案件编号)
- 第三个sed替换:匹配无4位案件编号的文件名,自动填充
0000作为案件编号后生成迁移命令
执行方式
- 直接执行:将上述命令在终端运行,自动创建目标目录并复制文件
- 批量执行:将命令输出保存为脚本文件,后续执行:
# 生成脚本 find . -type f -print0 | sed -zE ' s|^(.*)/([^/]+)$|\1\x00\2|; s|^([^\x00]*)\x00([a-zA-Z][0-9]{3,5})([0-9]{4})(\..*)$|mkdir -p "/dest/\2/\3/"; cp -p "\1/\2\3\4" "/dest/\2/\3/\2\3\4"|; s|^([^\x00]*)\x00([a-zA-Z][0-9]{3,5})(\..*)$|mkdir -p "/dest/\2/0000/"; cp -p "\1/\2\3" "/dest/\2/0000/\2\3"| ' > migrate_files.sh # 赋予执行权限 chmod +x migrate_files.sh # 执行脚本 ./migrate_files.sh
内容的提问来源于stack exchange,提问作者John Lockwood
相关产品推荐
相关产品推荐

