如何在 ubuntu 上的 7zipfull 中解压具有多个密码的多个文件

如何在 ubuntu 上的 7zipfull 中解压具有多个密码的多个文件

我是 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在这个循环中,我们通过明确声明三个可选值pass1pass2和来定义变量pass3。循环将为每个值运行一次。

3. -7za命令

尝试使用给定的密码从我们的列表中提取当前文件。对于每个文件,都会尝试$file所有三种$password可能性。嵌套循环的顺序是这样的,内循环总是在进入外循环的下一步之前完全运行。

4.&& break部分

break将停止最内层循环的循环运行。因此,如果我们break在尝试密码循环后调用,则甚至不会尝试选项。问题是什么时候不尝试其他密码。很简单:成功提取文件后,pass1无需对该文件尝试其他密码。pass2pass3pass1

每个命令都有一个exit status表示0成功的数字,或者表示任何其他数字fail(该数字的实际值可以提供有关出现问题的更多信息,但这取决于各个程序)。man 7za显示在DIAGNOSTICS

0 正常(未检测到错误或警告)

1 警告(非致命错误)。例如,某些文件在压缩过程中无法读取,因此未压缩

2 致命错误

因此,如果文件成功提取,退出代码应为0,如果密码无法解锁,则应为2。您可以通过获取前一个命令的退出状态。只需在运行或(总是成功或总是失败的命令)后echo $?尝试即可。echo $?truefalse

现在&& 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 变量
  • &&并被||称为运营商
  • 以此为开始,尝试理解它的作用并享受编写脚本的乐趣。

相关内容