Bash关联数组存储的Zip文件批量解压报错及7z使用疑问
为什么unzip用数组参数会报错?
核心原因是unzip的命令参数逻辑不支持一次性传入多个zip文件作为处理目标。当你执行unzip -qqc "${!fileInFolder[@]}"时,unzip会把第一个数组元素当作要解析的zip文件,而后面的所有元素都被当成这个zip文件内的文件名去查找——显然这些文件名不存在于第一个zip里,所以就会抛出caution: filename not matched:的警告。
那为什么unzip -qqc "${zipFolder}/"*".zip"能正常工作?其实这是个巧合或者你的误解:这个写法里的引号位置让shell把${zipFolder}/和*.zip拼接后展开成多个zip路径,但unzip依然只会处理第一个zip文件,后面的文件还是会被当作该zip内的文件名。如果你的测试场景里刚好第一个zip包含和其他zip同名的文件,或者你没注意到后面的警告,才会误以为它正常工作。
正确的解决方法
方法1:循环遍历数组逐个处理(兼容所有unzip版本)
既然unzip不支持批量处理多个zip,那我们就循环遍历关联数组的每个键(也就是zip文件路径),逐个执行unzip命令:
for zipfile in "${!fileInFolder[@]}"; do unzip -qqc "$zipfile" done
这样每个zip文件都会被单独处理,内容会依次输出到标准输出,完全符合你的需求。
方法2:用7z批量处理(更高效)
你提到尝试7z但没找到批量传入的方法,其实7z是支持直接传入多个归档文件的。用-so选项让7z把提取的内容输出到标准输出,x命令用于提取文件,直接把所有zip文件路径作为参数传入即可:
7z x -qq -so "${!fileInFolder[@]}"
这里-qq是静默模式(和unzip的-qq效果一致),-so指定输出到标准输出,这样就能一次性处理所有zip文件并输出内容,比循环更高效。
内容的提问来源于stack exchange,提问作者Nathanaël

