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

mra*_*ray 5 linux

我知道使用拙劣的 unTAR 可以做到这一点,尽管我不记得确切的命令了……但是在这种情况下,是否可以使用 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
Run Code Online (Sandbox Code Playgroud)

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

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

 0L'†C  0L'†C  !?V?B PK&Å‘:?@`¢îF3$ Lmacos/lib/libexiv2.2.1.0.dylib
Run Code Online (Sandbox Code Playgroud)

无需手动筛选该列表,是否有灵丹妙药?

use*_*517 10

你可以试试

unzip -t zipfile.zip | awk '{print $2}' | tail -n +2 | xargs echo
Run Code Online (Sandbox Code Playgroud)

或者

unzip -t zipfile.zip | awk '{print $2}' | sed 's/zipfile.zip//' | xargs echo
Run Code Online (Sandbox Code Playgroud)

如果文件名中有空格

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

检查输出是否合理,然后更改echorm。特别是检查您的 zipfile 是否未在输出中列出。这并不完美,因为它会使目录保持不变,但它可能比手动浏览它更容易。


mra*_*ray 5

Iain 的回答在我的机器上抛出了一个我无法弄清楚的与头部相关的错误......所以我继续编写了包含他的部分解决方案的小 BASH 脚本,并且效果很好......只需传递原始 zip作为此ununzip.sh脚本的参数.. 注释 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
Run Code Online (Sandbox Code Playgroud)