列出 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 存档成员路径列表的方法之一。