解决convmv命令Argument list too long错误的批量处理方法
解决convmv参数列表过长的批量处理方法
遇到convmv: Argument list too long是因为通配符匹配的文件数量过多,超出了系统允许的命令行参数长度。下面给你几个实用的解决办法:
方法1:用find + xargs 分批传递文件
xargs会自动把find输出的文件名分成小批量传给convmv,还能兼容带空格的文件名:
# 仅处理目标目录下的文件(不递归子目录),每批传100个文件,可自行调整数字 find /data/MyVid/Myfile -maxdepth 1 -type f -print0 | xargs -0 -n 100 convmv -f utf8 --nfd -t utf8 --nfc --notest
如果需要递归处理子目录里的文件,去掉-maxdepth 1参数即可。
方法2:用Bash数组分批循环处理
利用Bash的数组特性,手动控制每批处理的文件数量:
# 将目标目录的所有文件存入数组 files=(/data/MyVid/Myfile/*) # 设置每批处理的文件数,可根据实际情况调整 batch_size=100 # 循环分批执行命令 for ((i=0; i<${#files[@]}; i+=batch_size)); do convmv -f utf8 --nfd -t utf8 --nfc --notest "${files[@]:i:batch_size}" done
方法3:用find的-exec批量处理
find的-exec {} +会自动分批传递文件,既能避免参数过长问题,效率也比逐个处理高:
# 处理目标目录及子目录下的所有文件 find /data/MyVid/Myfile -type f -exec convmv -f utf8 --nfd -t utf8 --nfc --notest {} +
如果只需要处理当前目录的文件,加上-maxdepth 1参数即可。
另外补充下你之前用ls -la | convmv无效的原因:convmv不支持从标准输入读取文件名,它只接受命令行参数,所以管道传递的内容无法被识别。
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

