递归查找Dev目录并使用ImageMagick Convert缩放复制图片
问题解决:递归查找Dev目录并缩放复制图片
你之前的命令报错是因为find的-exec参数无法直接执行shell循环语句,必须通过调用bash来包裹循环逻辑,同时要正确处理路径中的空格和变量传递。以下是修正后的命令及说明:
正确命令
find . -name 'Dev' -type d -exec bash -c ' target_dir="/Volumes/IMAGES2023/IMAGES2023/senior-collect" # 确保目标目录存在,不存在则创建 mkdir -p "$target_dir" # 遍历当前Dev目录下的常见图片格式,可按需添加更多格式(如webp) for img in "$1"/*.{jpg,jpeg,png,gif}; do # 跳过未匹配到的格式(避免处理类似"*.webp"的非文件) [ -f "$img" ] || continue # 获取图片文件名 filename=$(basename "$img") # 缩放并保存到目标目录 convert "$img" -resize 300x300 "$target_dir/$filename" done ' bash {} \;
关键说明
bash -c的作用:将循环逻辑作为bash脚本执行,find找到的Dev目录路径会作为参数$1传递给脚本,解决了-exec无法直接解析shell循环的问题。- 引号包裹变量:所有路径变量都用双引号包裹,避免文件名或目录名含空格时出现解析错误。
- 图片格式过滤:通过
*.{jpg,jpeg,png,gif}指定要处理的图片格式,可根据实际需求添加或修改(比如加上webp)。 - 目标目录预创建:
mkdir -p确保目标目录存在,防止convert因目录不存在而报错。
可选优化
- 如果需要忽略目录名大小写(同时匹配
dev/Dev/DEV),将-name 'Dev'改为-iname 'dev'。 - 如果Dev目录下还有子目录需要递归处理图片,可将命令改为直接查找图片文件:
find . -path '*/Dev/*' -type f \( -iname '*.jpg' -o -iname '*.png' -o -iname '*.jpeg' -o -iname '*.gif' \) -exec bash -c ' target_dir="/Volumes/IMAGES2023/IMAGES2023/senior-collect" mkdir -p "$target_dir" filename=$(basename "$1") convert "$1" -resize 300x300 "$target_dir/$filename" ' bash {} \;
内容的提问来源于stack exchange,提问作者natefromdetroit
相关产品推荐
相关产品推荐

