我运行这个脚本,但是提取 rar 多部分有问题
#!/usr/bin/env bash
shopt -s extglob nullglob
passw=(
passfoo
passbar
passfoobar
banana
chocolate
whiskey
vodka
icecream
)
for f in *.@(rar|zip|zip.001|7z|7z.001); do
for p in "${passw[@]}"; do
if 7z x -y -p"$p" "$f" -aoa; then
break
fi
done
done
使用.zip
or.7z
它可以很好地解压缩多部分,因为多部分的扩展是相等的(对于.7z
= 7z.001
、7z.002
等。对于.zip
= zip.001
、zip.002
等)。问题是,如果我将其添加到脚本中:
*.@(rar|part1.rar|zip|zip.001|7z|7z.001)
它失败是因为*.partX.rar
两者都以.rar.rar
结尾,并且循环一遍又一遍地解压缩相同的东西,或者如果文件有密码则继续失败.part2.rar
尝试解决问题失败:
排除任何文件
.part2.rar
(例如*.part{2..99}.rar
:)使用开关“-x”
我感谢帮助完成循环并以.rar
格式集成多部分文件的解压缩
在外循环中要做的第一件事可能是检查是否
$f
有资格被跳过。在 Bash 中,您可以
[[
使用模式匹配(with=
或)==
或!=
正则表达式(with=~
)来执行此操作。后一种选择更强大。你的情况应该有效:我使用的表达式由以下部分组成:
\.
– 匹配文字点part
,rar
,1
– 这些分别匹配part
,rar
和1
字面意思[[:digit:]]+
– 匹配一个或多个数字(由当前语言环境定义)0*
– 匹配零个或多个0
字符$
– 匹配被测字符串的结尾!
否定。逻辑是这样的:如果文件名以(或,或等)
.part<digit(s)>.rar
结尾,则继续下一次迭代(即下一次并重新开始)。.part1.rar
.part01.rar
.part001.rar
f
如果我是你,我会添加
nocaseglob
到该shopt -s …
行中,以匹配FOO.RAR
与你的模式 (*.@(rar|zip|zip.001|7z|7z.001)
) 类似的名称。我的测试表明这足以使我的解决方案 (=~
) 也可以与它们一起使用 (无需额外启用nocasematch
)。