如何“撤消”在终端/CLI 中执行的“解压缩”?

如何“撤消”在终端/CLI 中执行的“解压缩”?

我知道使用拙劣的 unTAR 可以做到这一点,尽管我不记得确切的命令......但是是否可以“撤消”最近的“unzip”命令,在这种情况下,使用 mac 终端?

这是/usr/bin/unzip在 10.7 上使用的,使用 UnZip 5.52。

假设我从这样的文件夹结构开始......

admin$ pwd
    /usr/local/src
admin$ ls
    pots            pans           scrubbers.zip
admin$ unzip scrubbers.zip
admin$ ls
    pots               pans           scrubbers.zip
    zebraturd.doc      README.md      morestuffididntmeantoputhere.py      cleanme.junkmail                 
    surfraw.2.html     scrubbers.explaination

我怎样才能“重新压缩”或者反向解析 zip 文件?

在 zip 文件中,有一个部分列出了存档中的文件,尽管内容被严重损坏了...例如...

 0L'†C  0L'†C  !∏V≤B PK&Å‘:√@`¢îF3$ Lmacos/lib/libexiv2.2.1.0.dylib

如果不手动筛选该列表,是否有灵丹妙药可以解决这个问题?

答案1

你可以尝试

unzip -t zipfile.zip | awk '{print $2}' | tail -n +2 | xargs echo

或者

unzip -t zipfile.zip | awk '{print $2}' | sed 's/zipfile.zip//' | xargs echo

如果文件名中有空格

unzip -l zipfile.zip | tail -n +4 | head -n -2 | awk '{print "\""substr($0,index($0,$4))"\""}' | xargs rm

检查输出是否合理,然后更改echorm。特别检查您的 zip 文件是否未在输出中列出。这并不完美,因为它不会触及目录,但它可能比手动浏览所有内容更容易。

答案2

Iain 的回答在我的计算机上引发了一个与头部相关的错误,我无法弄清楚...所以我继续编写了一些包含他的部分解决方案的 BASH 脚本,并且运行得很好...只需将原始 zip 作为参数传递给这个解压文件脚本..注释掉 rm 行来预览“动作”。

#!/bin/bash
COUNT=0                                   # USAGE:
PURGE=CLEAR                               # chmod +x ununzip.sh && ./ununzip.sh file.zip
THATDARNzip=$1                            # THIS IS YOUR file.zip, THE ARGUMENT
PURGE=(`unzip -t THATDARNzip | awk '{print $2}' |  xargs echo`)
COUNT=${#PURGE[@]}                        # HOW MUCH STUFF GOT UNZIPPED?
echo "total items "$COUNT
echo -e "item at 0 is ${PURGE[0]}"        # WE DON'T DELETE THE ORIGINAL ZIP FILE
while [ "$COUNT" -gt 0 ]; do
echo -e "deleting ${PURGE[${COUNT}]}"
rm -r "${PURGE[${COUNT}]}"                # COMMENT THIS LINE FOR A DRY RUN
COUNT=$[ $COUNT - 1 ]
done
exit 0

答案3

我只是手动删除了垃圾文件,同时极力告诫自己没有先检查 zip 文件的格式是否合理(它们总是不合理的)unzip -l

答案4

尝试这个:

$ unzip -l scrubbers.zip | sed '1,3d' | sed 'N;$!P;$!D;$d' | awk '{ print $4 }' | xargs rm -fr

相关内容