我要根据内部结构处理46 .zip文件。
分支详细信息的第一个有用的检查是检查特定文件是否在.zip中是presente。
实际上我是解压缩并测试解压缩文件的存在。
但是,我问你,有没有办法检查文件是否在zip文件中,而不是完全提取它,只使用bash命令?
答案 0 :(得分:7)
要检查特定文件,您可以将unzip -l
与grep
合并以搜索该文件。该命令看起来像这样
unzip -l archive.zip | grep -q name_of_file && echo $?
这样做会列出archive.zip
中的所有文件,并将它们移至grep
,搜索name_of_file
。 grep
如果找到匹配项,则会退出退出代码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 bash
答案 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