从 zip 中提取特定文件名而不解压它

从 zip 中提取特定文件名而不解压它

列出 zip 文件的内容如下:

wladmin@solarishost:/tmp$ unzip -l -q /tmp/package-391.zip | awk '{ print $4 }' | sed -n '3,$p' | grep -v '^$'
myapp/src/stage/bras.war
myapp-configuration/src/config/dev/bras.war
myapp-configuration/src/config/dev/deployfiles/acid.properties
myapp-configuration/src/config/perf/deployfiles/acid.properties
myapp-configuration/src/config/prod/deployfiles/acid.properties
myapp-configuration/src/config/qa/deployfiles/acid.properties
myapp-configuration/src/config/uat/deployfiles/acid.properties

从上面我希望通过获取所有具有deployfile和不具有的文件名来创建删除文件列表DEV,我可以使用下面的方法来做到这一点。

wladmin@solarishost:/tmp$ unzip -l -q /tmp/package-391.zip | awk '{ print $4 }' | sed -n '3,$p' | grep -v '^$' | grep deployfiles | grep -v -i DEV
myapp-configuration/src/config/perf/deployfiles/acid.properties
myapp-configuration/src/config/prod/deployfiles/acid.properties
myapp-configuration/src/config/qa/deployfiles/acid.properties
myapp-configuration/src/config/uat/deployfiles/acid.properties

从剩下的东西即

myapp/src/stage/bras.war
myapp-configuration/src/config/dev/bras.war
myapp-configuration/src/config/dev/deployfiles/acid.properties

从剩余的输出中,我希望获得任何出现多次的文件名,即

myapp-configuration/src/config/dev/bras.war

并将其添加到删除文件列表中

最终期望的输出:

myapp-configuration/src/config/perf/deployfiles/acid.properties
myapp-configuration/src/config/prod/deployfiles/acid.properties
myapp-configuration/src/config/qa/deployfiles/acid.properties
myapp-configuration/src/config/uat/deployfiles/acid.properties
myapp-configuration/src/config/dev/bras.war

最终目标是我将使用最终所需的输出列表从 zip 中删除这些文件并仅使用以下 2 个文件重建 zip:

myapp/src/stage/bras.war
myapp-configuration/src/config/dev/deployfiles/acid.properties

请建议。

wladmin@solarishost:/tmp$ uname -a

SunOS solarishost 5.11 11.4.62.151.3 sun4v sparc sun4v non-global-zone

答案1

这是一个有点复杂的规范。如果我理解正确,您需要路径不包含的存档成员列表deployfiles(除非它们也包含dev不区分大小写),并忽略具有相同基名的后续文件。

所以:

zipinfo -1 file.zip | nawk -F/ '
  (! /deployfiles/ || tolower($0) ~ /dev/) && !seen[$NF]++'

zipinfo -l存在仅获取 zip 存档成员路径列表的方法之一

相关内容