Bash: 如何检查压缩文件是否包含指定的 path/file.ext?

Bash: How to check if a zip file contain a specified path/file.ext?

我要根据内部结构处理 46 个 .zip 文件。

分支阐述的第一个有用检查是检查 .zip 中是否存在特定文件。

实际上我正在解压缩并测试解压缩文件是否存在。

但是,我问你,有没有办法只使用 bash 命令来检查文件是否在 zip 文件中而不完全解压缩?

要检查特定文件,您可以结合使用 unzip -lgrep 来搜索该文件。该命令看起来像这样

unzip -l archive.zip | grep -q name_of_file && echo $?

它的作用是列出 archive.zip 中的所有文件,将它们通过管道传送到 grep,后者搜索 name_of_filegrep 如果找到匹配项,退出代码为 0-q 使 grep 的输出静音,并在找到匹配项时立即退出,退出代码为 0echo $? 将打印 grep 的退出代码。如果您想在 if 语句中使用它,您的 bash 脚本将如下所示:

unzip -l archive.zip | grep -q name_of_file;
if [ "$?" == "0" ]
then
    ...
fi;

在命令行上你可以试试:

$ if [[ `unzip -Z1 audio.zip | grep help.mp3` ]];then echo 'yes';fi

如果找到 help.mp3,输出将是 yes

参见:

help [[  

另一种方法是:

if [[ -n `unzip -Z archive.zip file 2>/dev/null` ]]; then
    echo 'yes'
else
    echo 'no'
fi

这些方法中的大多数都按预期工作,除非文件名包含换行符等非标准字符。示例:

$ unzip -l foo.zip
Archive:  foo.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  05-06-2020 12:25   foo^Jbar
        0  05-06-2020 12:25   foonbar
---------                     -------
        0                     2 files

如您所见,换行符被替换为^J。您可以在您的 grep 中开始使用它,但随后您需要牢记所有其他 Control characters

以下方法始终有效:

$ unzip -Z foo.zip foo$'\n'bar &>/dev/null && echo true || echo false
true
$ unzip -l foo.zip foo$'\n'bar &>/dev/null && echo true || echo false
true