如何使用Unix shell脚本实现这一点?
unzip -P your-password zipfile.zip
-P password
使用 password 解密已加密的 zip 文件条目(如果有)。这是不安全的!许多多用户操作系统提供了一种方法,使任何用户都可以查看其他用户的当前命令行;即使在独立系统上,也总存在着隔壁偷窥的威胁。将明文密码作为自动化脚本中的一部分存储在命令行中甚至更糟。尽可能使用非回显式交互提示输入密码。(并且在安全真正重要的情况下,使用强加密,如PGP,而不是标准zip文件工具提供的相对较弱的加密。)
7z x archive.zip -ppassword
命令起作用了。 - Kapilneed PK compat. v5.1 (can do v4.6)
- ACVsudo apt-get install p7zip-full
sudo apt-get install p7zip-full
然后,您可以使用Ubuntu默认的压缩文件管理器解压受密码保护的zip文件。
我在使用unzip
时遇到了问题,显示需要PK兼容性v5.1(可以使用v4.6)。
我安装了p7zip
,然后使用以下命令进行解压:
unzip命令出现“need PK compat. v5.1 (can do v4.6)”错误时,可尝试安装p7zip
并使用以下命令解压:
7z x archive.zip -ppassword
解压多个受密码保护的文件时,此命令不起作用
unzip -P PASSWORD *.zip
为了使其起作用,您需要将*.zip
放在引号中,因为无论何时使用通配符(*),shell本身都会扩展它并将结果传递给程序。这是因为与UNIX中的大多数程序不同,unzip不能一次接受多个文件。
在此处阅读更多信息:https://chrisjean.com/unzip-multiple-files-from-linux-command-line/。
因此,要解压多个受保护的文件,请使用以下命令:
unzip -P PASSWORD '*.zip'
sudo apt install p7zip-full
7z x example.zip
访问以下网址获取更多详细信息:详情请点击此处
在多次撞墙后,我来发表一下我的看法。
如果你收到的密码包含特殊字符,比如 $ ; \ 等等,你的 shell 终端可能会将其解释为 shell 特殊符号的一部分,而不是你想要的密码字符串。
解决方法很简单,将密码用单引号括起来!
7z x [yourzipfile] -P'your$pass;word!'
希望这能帮助你节省时间,当突然间似乎你的 zip/unzip 加密密码无法使用时!
# (my preference) Unzip myfile.zip into dir myfile/
unar -p my_password path/to/myfile.zip
# Unzip myfile.zip into the current directory
unzip -P my_password path/to/myfile.zip
# Unzip myfile.zip into dir myfile/
unzip -P my_password -d myfile path/to/myfile.zip
我在这里了解到使用-d some/directory
选项来解压缩zip文件:如何将zip文件提取到特定文件夹中?。
我更喜欢使用unar
而不是unzip
,因为unar
会自动将内容解压缩到与文件同名的文件夹中,这非常方便,可以防止我将提取的文件放错位置。
find
、xargs
和unar
并行解压缩多个密码保护的文件如果您一次要解压缩数百甚至数千个文件,可以使用xargs
并行操作,每个CPU核心生成一个进程(如nproc
所示),直到所有文件完成。这样可以大大提高速度!下面是具体方法:
# Unzip many password-protected files at once, assuming they all have the same
# password
# Generally what I use:
# - Note: `-maxdepth 1` causes this to only unzip *top-level* .zip files within
# your current directory
time find . -maxdepth 1 -type f -iname "*.zip" -print0 | xargs -0 -I{} -n 1 -P $(nproc) unar -p my_password -f {}
# Or, remove `-maxdepth 1` to unzip *all* .zip files, recursively, which are
# found within your current directory or lower.
time find . -type f -iname "*.zip" -print0 | xargs -0 -I{} -n 1 -P $(nproc) unar -p my_password -f {}
nproc
命令显示我有20个核心。-P $(nproc)
更改为-P 1
,则得到以下命令(time find . -type f -iname "*.zip" -print0 | xargs -0 -I{} -n 1 -P $(nproc) unar -p my_password -f {}
),这需要9.246秒。每个文件耗时9.246秒/93个文件= 0.099秒,即慢了8.25倍。
只是为了好玩,我还运行了一个串行解压命令:time unzip -o -P my_password '*.zip'
(请注意,-o
是危险的,意味着"覆盖"现有文件),作为速度比较。在我的93个文件上花费了8.196秒,也比上面的多进程unar
命令慢得多,后者只需1.084秒,更糟糕的是,它创建了一个庞大且无法使用的混乱的文件堆叠在同一个目录中。
因此,请使用上面的并行形式,其中我将find
管道传递给xargs
和unar
。
unzip -P my_password path/to/myfile.zip
。find
管道传递给xargs
和unar
进行并行提取操作。