Bash:如何检查zip文件是否包含指定的路径/ file.ext?

时间:2017-09-04 09:37:57

标签: bash unzip

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

分支详细信息的第一个有用的检查是检查特定文件是否在.zip中是presente。

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

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

4 个答案:

答案 0 :(得分:7)

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

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

这样做会列出archive.zip中的所有文件,并将它们移至grep,搜索name_of_filegrep如果找到匹配项,则会退出退出代码0-q使grep的输出静音,并在找到匹配项时使用退出代码0立即退出。 echo $?将打印退出代码grep。如果要在if语句中使用它,您的bash脚本将如下所示:

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

答案 1 :(得分:2)

在命令行上你可以尝试:

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

如果找到help.mp3,则输出为yes

见:

help [[  

on

答案 2 :(得分:2)

除了文件名包含非标准字符(例如换行符)外,大多数方法都可以按预期工作。示例:

$ 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

答案 3 :(得分:0)

另一种方法是:

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