Bash: 如何检查压缩文件是否包含指定的 path/file.ext?
Bash: How to check if a zip file contain a specified path/file.ext?
我要根据内部结构处理 46 个 .zip 文件。
分支阐述的第一个有用检查是检查 .zip 中是否存在特定文件。
实际上我正在解压缩并测试解压缩文件是否存在。
但是,我问你,有没有办法只使用 bash 命令来检查文件是否在 zip 文件中而不完全解压缩?
要检查特定文件,您可以结合使用 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;
在命令行上你可以试试:
$ if [[ `unzip -Z1 audio.zip | grep help.mp3` ]];then echo 'yes';fi
如果找到 help.mp3
,输出将是 yes
参见:
help [[
在 bash
另一种方法是:
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
我要根据内部结构处理 46 个 .zip 文件。
分支阐述的第一个有用检查是检查 .zip 中是否存在特定文件。
实际上我正在解压缩并测试解压缩文件是否存在。
但是,我问你,有没有办法只使用 bash 命令来检查文件是否在 zip 文件中而不完全解压缩?
要检查特定文件,您可以结合使用 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;
在命令行上你可以试试:
$ if [[ `unzip -Z1 audio.zip | grep help.mp3` ]];then echo 'yes';fi
如果找到 help.mp3
,输出将是 yes
参见:
help [[
在 bash
另一种方法是:
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