我是 Linux 的新手,遇到了一些困难。在 Ubuntu 19.10 上,我为 7zip 编写了一个小脚本,用于使用密码解压缩多个文件:
FILES=/mnt/sdx
for f in *.7z;
do 7za x -oUNZIPPED $f -ppassowrd;
done
它对于一个密码来说非常有效,但问题是,如果我从包含压缩文件的站点下载旧文件,它会使用另一个密码,因此程序无法打开,然后我必须制作另一个脚本以使另一个密码起作用。
我想知道的是,您是否不能将这些旧密码集成到脚本中,例如,如果他尝试使用一个密码而文件无法解压,它会尝试使用另一个密码,直到文件成功解压或可用密码用完为止。
另外,一些较旧的文件在 .rar 中。我如何扩展这两个文件的脚本搜索?
更新:它终于成功了!感谢大家的帮助和耐心,最终脚本如下所示:
#!/bin/bash
for file in *.{7z,zip,rar}
do
for password in Pass1 Pass2 Pass3
do
7z x -oOUTPUTDIR -p"${password}" "${file}" && break
done
done
我采用了您提供的代码并进行了微小的修改,再次感谢!!
答案1
可能的脚本 - 将其保存在名为 7za_script.sh 的文件中
#!/bin/bash
for file in *.7z
do
for password in pass1 pass2 pass3
do
7za x -oOUTPUTDIR -p"${password}" "${file}" && break
done
done
它有什么作用?
1. 外循环for file in *.7z
我们将变量 定义file
为当前工作目录中以 结尾的任何条目.7z
。*
此处的 是一个通配符,可扩展为零或任意数量的字符。*.7z
因此将匹配任何带有后缀的内容7zip
。 循环现在每匹配一次运行一次,我们可以通过 引用当前循环运行的匹配$file
,即调用变量。
2. 内循环for password in pass1 pass2 pass3
password
在这个循环中,我们通过明确声明三个可选值pass1
、pass2
和来定义变量pass3
。循环将为每个值运行一次。
3. -7za
命令
尝试使用给定的密码从我们的列表中提取当前文件。对于每个文件,都会尝试$file
所有三种$password
可能性。嵌套循环的顺序是这样的,内循环总是在进入外循环的下一步之前完全运行。
4.&& break
部分
break
将停止最内层循环的循环运行。因此,如果我们break
在尝试密码循环后调用,则甚至不会尝试选项。问题是什么时候不尝试其他密码。很简单:成功提取文件后,pass1
无需对该文件尝试其他密码。pass2
pass3
pass1
每个命令都有一个exit status
表示0
成功的数字,或者表示任何其他数字fail
(该数字的实际值可以提供有关出现问题的更多信息,但这取决于各个程序)。man 7za
显示在DIAGNOSTICS
:
0 正常(未检测到错误或警告)
1 警告(非致命错误)。例如,某些文件在压缩过程中无法读取,因此未压缩
2 致命错误
因此,如果文件成功提取,退出代码应为0
,如果密码无法解锁,则应为2
。您可以通过获取前一个命令的退出状态。只需在运行或(总是成功或总是失败的命令)后echo $?
尝试即可。echo $?
true
false
现在&& command
意味着“如果前一个命令成功(退出状态 = 0
),则运行命令。所以我们要做的是:如果$password
解锁$file
(并且没有其他错误发生),我们break
进入密码循环,因为没有理由在该文件上尝试其他密码。相反,我们现在可以继续下一个文件。
5.运行脚本
将脚本另存为例如7za_script.sh
并根据需要在其中写入密码后,您可以通过运行它bash 7za_script.sh
或使其可执行chmod +x 7za_script.sh
并通过运行它./7za_script.sh
。
6. 注意事项
- 该脚本非常简单,但仅作为您脚本编写生涯的一个基础起点。
- 将其移动到您想要的目录并执行它。
1.7za
文件名和目录名不会有区别2.7za
(这显然根本不是压缩文件,只是共享名称)。下一步是测试这一点。- 将密码存储在明文文件中是非常不安全的,但是它本来似乎是一个安全性较低的问题。
- 引用
"
并调用变量而${var}
不是$var
使脚本更稳定,例如文件名中有空格。这里就不详细介绍了,但留下关键词:硬引号、软引号、shell 变量 &&
并被||
称为运营商- 以此为开始,尝试理解它的作用并享受编写脚本的乐趣。