如何编写FOR循环按文件扩展名将对应文件移动到指定目录
按文件扩展名自动分类的FOR循环实现方案
你之前的尝试已经接近需求,现有写法的核心问题有两个:
- 用单引号包裹
find命令不会触发命令执行,只会把整个字符串当成一个遍历项 - 逻辑方向错误:不需要把找到的文件当成文件夹创建,而是要遍历所有文件,提取每个文件的扩展名,创建对应扩展名文件夹后移动文件进去
通用全扩展名自动分类方案
不需要逐个指定jpg、png等格式,自动适配所有存在的文件扩展名:
# 进入需要扫描的根目录 cd /media || exit # 定义分类后文件的统一存储根目录 target_root="/media/genesis/Passport/consolidated" # 遍历所有普通文件,兼容带空格、特殊字符的文件名 find . -type f | while read -r file; do # 提取扩展名并统一转小写,和你之前统计扩展名的逻辑对齐 ext=$(echo "${file##*.}" | tr '[:upper:]' '[:lower:]') # 没有扩展名的文件统一归类到no_ext文件夹 if [ "$ext" = "$file" ]; then ext="no_ext" fi # 自动创建对应扩展名文件夹,-p参数避免文件夹已存在时报错,解决mv不能自动建目录的问题 mkdir -p "${target_root}/${ext}" # 移动文件,-n参数避免覆盖重名文件防止数据丢失 mv -n "$file" "${target_root}/${ext}/" done
仅处理JPG格式的简化FOR循环方案
如果你只需要单独整理jpg格式文件,可以用更简单的写法:
# 先手动创建目标文件夹 mkdir -p /media/genesis/Passport/consolidated/jpg # 遍历所有jpg格式文件移动 for file in $(find /media -iname '*.jpg'); do mv -n "$file" /media/genesis/Passport/consolidated/jpg/ done
注意事项
- 你之前用来统计各扩展名文件数量的命令是完全正确的,可以先执行一遍确认有哪些扩展名,提前排查异常情况
- 正式执行前可以先把代码里的
mv -n改成echo mv -n,运行一遍看输出的移动路径是否符合预期,确认无误后再去掉echo执行 - 数千个文件的场景下,推荐用第一种
while read的写法,不会出现参数过长的报错,稳定性更高
内容的提问来源于stack exchange,提问作者Howie B
相关产品推荐
相关产品推荐

