按开头特征(数字/空格/大写)分类迁移文件的技术实现问询
修复后的文件分类迁移脚本
原脚本存在的问题
- 条件判断语法错误:
[ $nfile=^[0-9]*]不符合Shell正则匹配规则,test命令不支持^开头的正则匹配,且=两侧必须保留空格 - 目录创建逻辑冗余:循环内重复执行
mkdir NUMBERS,会因目录已存在反复报错,应提前处理目录创建 - 仅处理
.png格式文件,未覆盖所有需要分类的文件 - 未实现空格开头、大写字母开头文件的分类逻辑
- 未处理带空格的文件名:直接使用
$nfile会导致带空格的文件名被拆分,必须用双引号包裹变量
完整实现脚本
#!/bin/sh # 提前创建所有目标目录,-p参数避免目录已存在时报错 mkdir -p NUMBERS SPACE_START UPPER_START # 遍历当前目录下所有条目(包含特殊字符、空格开头的文件) for file in ./*; do # 跳过子目录,仅处理普通文件 [ -f "$file" ] || continue # 提取纯文件名(去掉前缀的./) filename="${file#./}" # 通过case语句匹配开头字符,执行分类迁移 case "$filename" in [0-9]*) mv "$file" NUMBERS/ ;; " "*) mv "$file" SPACE_START/ ;; [A-Z]*) mv "$file" UPPER_START/ ;; # 其他开头的文件可在此添加处理逻辑,默认不操作 *) : ;; esac done
脚本说明
mkdir -p:一次性创建所有目标目录,若目录已存在则无操作,避免循环内重复创建的报错问题./*:遍历当前目录下所有条目,确保捕获以空格、特殊字符开头的文件(若需处理隐藏文件,可改为./.* ./)[ -f "$file" ] || continue:过滤掉子目录,仅处理普通文件case语句:兼容性更强(适用于标准sh环境),精准匹配不同开头的文件名:[0-9]*):匹配数字开头的文件" "*):匹配空格开头的文件[A-Z]*):匹配大写字母开头的文件
- 双引号包裹变量:确保带空格、特殊字符的文件名被正确识别,避免拆分出错
- 若需求为复制而非迁移,将
mv替换为cp即可
内容的提问来源于stack exchange,提问作者chaosTheory
相关产品推荐
相关产品推荐

