Shell脚本:将命令输出存入变量并编写for循环处理JPG文件
把嵌套目录的JPG文件存入变量并遍历处理的Shell脚本实现
嘿,这个需求在日常脚本编写里太常见了,我来一步步帮你搞定~
一、正确将命令输出存入变量(处理含空格/特殊字符的文件名)
首先,千万别直接用普通变量存输出——如果你的JPG文件名里有空格、换行或者特殊字符,普通变量会把它们拆成多个元素,导致后续处理出错。正确的做法是用数组来存储文件路径:
# 用find命令递归查找所有JPG文件(大小写兼容的话可以加-iname) jpg_files=() while IFS= read -r -d $'\0' file; do jpg_files+=("$file") done < <(find . -type f -name "*.jpg" -print0)
这里用了find的-print0选项和read的-d $'\0',目的是让文件路径以空字符分隔,完美避开空格、换行等特殊字符的问题。如果不需要兼容大小写,用-name "*.jpg"就行;如果要匹配.JPG/.jPg这类,换成-iname "*.jpg"。
二、用for循环遍历数组处理文件
有了数组之后,遍历就很简单了,直接用for循环读取数组元素:
# 遍历每个JPG文件 for file in "${jpg_files[@]}"; do echo "正在处理文件:$file" # 在这里添加你的处理命令,比如: # convert "$file" -resize 800x600 "resized_$(basename "$file")" done
注意一定要用"${jpg_files[@]}"(带双引号和@),这样每个数组元素都会被当作独立的字符串,不会因为空格被拆分。
三、完整脚本示例
把上面两部分整合起来,就是一个完整的脚本:
#!/bin/bash # 初始化数组存储JPG文件路径 jpg_files=() # 递归查找所有JPG文件并存入数组 while IFS= read -r -d $'\0' file; do jpg_files+=("$file") done < <(find . -type f -iname "*.jpg" -print0) # 检查是否找到文件 if [ ${#jpg_files[@]} -eq 0 ]; then echo "没有找到任何JPG文件" exit 1 fi # 遍历处理每个文件 echo "共找到${#jpg_files[@]}个JPG文件,开始处理..." for file in "${jpg_files[@]}"; do echo "当前处理:$file" # 这里替换成你的实际处理逻辑,比如复制、压缩、转换格式等 # 示例:复制到指定目录 # cp "$file" ./processed_jpgs/ done echo "所有文件处理完成!"
小提示
- 如果你的系统里
find不支持-print0(很少见),可以考虑用globstar选项(bash 4.0+支持):
这种写法更简洁,但同样要注意用数组存储,并且开启shopt -s globstar jpg_files=(**/*.jpg **/*.JPG)globstar来递归匹配子目录。
内容的提问来源于stack exchange,提问作者Mehdi
相关产品推荐
相关产品推荐

