编写脚本查找指定序号前的文件并迁移的技术求助
问题分析与解决方案
你的原命令失效的核心原因:ls -lrt | grep -v 'F_XYZ_221_'仅用于输出排除221的文件名,但后续的mv * /destination/是通过shell通配符直接匹配当前目录所有文件,完全未使用前面管道的输出结果,最终会把包括F_XYZ_221_2020.xml在内的所有文件都移走。
以下是几种可行的解决方案:
方案一:for循环+序号提取判断
直接遍历目标文件,提取序号后判断是否小于221,符合条件则执行移动:
# 先确保目标目录存在,避免移动失败 mkdir -p /destination/ for file in F_XYZ_*.xml; do # 从文件名中提取序号(按下划线分割后的第三个字段) num=$(echo "$file" | awk -F '_' '{print $3}') # 判断序号是否小于221,是则移动文件 if [ "$num" -lt 221 ]; then mv "$file" /destination/ fi done
方案二:find命令批量处理
适合文件数量较多的场景,通过find定位目标文件后调用脚本判断移动:
mkdir -p /destination/ find . -maxdepth 1 -type f -name "F_XYZ_*.xml" -exec bash -c ' # 提取文件名中的序号 num=$(echo "$1" | awk -F "_" "{print \$3}") # 判断序号并移动文件 if [ "$num" -lt 221 ]; then mv "$1" /destination/ fi ' _ {} \;
-maxdepth 1确保只处理当前目录的文件,不会递归子目录。
方案三:bash扩展glob匹配(简洁版)
如果你的shell是bash,可以开启扩展通配符,直接匹配所有序号小于221的文件:
mkdir -p /destination/ # 开启bash扩展glob功能 shopt -s extglob # 匹配1-220序号对应的文件 mv F_XYZ_@([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|220)_2020.xml /destination/ # 若年份不固定,可将2020替换为*匹配任意年份 # mv F_XYZ_@([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|220)_*.xml /destination/
注意事项
- 所有方案都先执行
mkdir -p /destination/确保目标目录存在 - 如果文件名包含空格或特殊字符,方案一和方案二中的双引号包裹变量可正确处理
- 扩展glob仅在bash中生效,其他shell(如zsh)语法可能不同
内容的提问来源于stack exchange,提问作者regalkp
相关产品推荐
相关产品推荐

