使用find+sh -s批量转TIFF为JPG遇文件过多拆分问题求助
解决批量TIFF转JPG时部分文件未处理的问题
我明白你遇到的困扰——当目录里的文件数量太多时,find会把文件名拆成多个批次传给sh进程,导致部分文件没被正确处理。其实核心问题主要出在参数解析和脚本的鲁棒性上,这里给你几个可行的解决方案:
方案1:逐个处理文件(简单稳妥)
如果对效率要求不是极致高,直接让find逐个调用处理脚本是最不容易出错的方式,避免批量参数拆分的问题:
#!/bin/sh find "$@" -iname 'PROC????.tif' -exec sh -c ' # 拿到当前要处理的文件路径 t="$1" # 转换格式,只有转换成功才删除原文件 ffmpeg -y -v quiet -i "$t" -c:v mjpeg "${t%.*}.jpg" && rm "$t" ' sh {} \;
这里的关键点是给变量加双引号("$t"),防止文件名里有空格、特殊字符时被错误拆分;同时用&&保证只有转换成功才删除原文件,避免意外丢失数据。
方案2:保留批量处理,修复脚本鲁棒性
如果想保持批量处理的高效性,只需要调整你的原脚本,确保每个sh进程都能正确处理所有传入的文件名:
#!/bin/sh find "$@" -iname 'PROC????.tif' -exec sh -s -- {} + << 'EOF' # 遍历所有传入的文件名 for t do # 带引号引用变量,避免特殊字符问题 ffmpeg -y -v quiet -i "$t" -c:v mjpeg "${t%.*}.jpg" && rm "$t" done EOF
主要修复的地方:
- 给
sh -s加上--:确保以-开头的文件名不会被当成sh的命令行选项 - 给
$t加上双引号:彻底解决文件名含空格、特殊字符时的参数解析错误 - 用
&&关联转换和删除操作:防止转换失败时误删原文件
原来的脚本之所以会出现部分文件未处理,大概率是因为文件名里有特殊字符(比如空格),导致未加引号的$t被拆分,或者IFS的设置在子shell中没有正确生效,引发参数解析混乱。
方案3:用xargs配合空字符分隔(终极鲁棒)
如果你的文件名里可能包含换行符这类极端情况,用find -print0和xargs -0的组合可以完美处理所有特殊文件名:
#!/bin/sh find "$@" -iname 'PROC????.tif' -print0 | xargs -0 sh -c ' for t do ffmpeg -y -v quiet -i "$t" -c:v mjpeg "${t%.*}.jpg" && rm "$t" done ' sh
-print0会让find用空字符分隔文件名,xargs -0则识别这种分隔方式,完全避免任何参数解析的问题。
内容的提问来源于stack exchange,提问作者DannyNiu
相关产品推荐
相关产品推荐

