Normalerweise dearchiviere ich Dinge mit $ mkdir newFolder; $ mv *.zip newFolder; $ cd newFolder; $unzip *.zip
aber manchmal werde ich faul und mache einfach in einem beliebigen Ordner $ unzip *.zip
also von Zeit zu Zeit mit anderen Inhalten durcheinander gebracht. Ich werde hier einige Methoden auflisten – einige Archivversionen haben sicherlich beschissene Flaggen, während andere spartanischer sind, letzteres interessiert mich mehr.
Einige Möglichkeiten zum De-Unarchivieren, gibt es andere?
-
$ find . -anewer fileThatExistedBeforeUnarchieving -ok rm '{}' ;
Schwächen sind, dass es den*.zip
auflistet dirs, also müssen Sie langsam-ok
verwenden , langsam bei vielen*.zip
Übereinstimmungen, und aus irgendeinem Grund scheint es nicht mit allem, was extrahiert wurde, übereinzustimmen. -
Wenn es sich um eine kleine Menge extrahierter Dateien handelt, einzeln, langsam, umständlich und fehleranfällig.
-
Wenn ich mich vergewissern möchte, ob der Inhalt des Archivs tatsächlich ein Ordner ist, überprüfe ich das manchmal mit
$ unzip -l *.bsd
, funktioniert zumindest in der unzip-Version von obsd.
Wenn Sie sich auf bestimmte Archivierungstools beziehen, geben Sie diese bitte an entsprechender Stelle an. Halten Sie es jedoch einfach – ich interessiere mich mehr für die WEGE, wie Sie es tun, als für ein einzelnes Tool.
Akzeptierte Antwort:
Nach Namen
Sie können die Liste der Dateien im Archiv generieren und löschen, obwohl dies bei Archivierern wie unzip oder 7z, die keine Option zum Generieren einer einfachen Liste von Dateinamen haben, ärgerlich fummelig ist. Selbst bei tar setzt dies voraus, dass Dateinamen keine Zeilenumbrüche enthalten.
tar tf foo.tar | while read -r file; do rm -- "$file" done
unzip -l foo.zip | awk '
p && /^ --/ {p=2}
p==1 {print substr($0, 29)}
/^ --/ {++p}
' | while …
unzip -l foo.zip | tail -n +4 | head -n -2 | while … # GNU coreutils only
7z l -slt foo.zip | sed -n 's/^Path = //p' | while … # works on tar.*, zip, 7z and more
Anstatt die Dateien zu entfernen, können Sie sie auch an ihren vorgesehenen Zielort verschieben.
tar tf foo.tar | while read -r file; do
if [ -d "$file" ]; then continue; fi
mkdir -p "/intended/destination/${file%/*}"
mv -- "$file" "/intended/destination/$file"
done
Verwendung von FUSE
Anstatt auf externe Tools angewiesen zu sein, können Sie (auf den meisten Unices) FUSE verwenden, um Archive mit gewöhnlichen Dateisystembefehlen zu manipulieren.
Sie können Fuse-zip verwenden, um in eine ZIP-Datei zu schauen und sie mit cp
zu extrahieren , listen Sie seinen Inhalt mit find
auf usw.
mkdir /tmp/foo.d
fuse-zip foo.zip /tmp/foo.d
## Remove the files that were extracted mistakenly (GNU/BSD find)
(cd /tmp/foo.d && find . ! -type d -print0) | xargs -0 rm
## Remove the files that were extracted mistakenly (zsh)
rm /tmp/foo.d/**(:"s~/tmp/foo.d/~~"^/)
## Extract the contents where you really want them
cp -Rp /tmp/foo.d /intended/destination
fusermount -u foo.d
rmdir foo.d
AVFS erstellt eine Ansicht Ihrer gesamten Verzeichnishierarchie, in der alle Archive ein zugehöriges Verzeichnis (gleicher Name mit angehängtem # am Ende) haben, das den Archivinhalt zu enthalten scheint.
mountavfs
## Remove the files that were extracted mistakenly (GNU/BSD find)
(cd ~/.avfs/"$PWD/foo.zip#" && find . ! -type d -print0) | xargs -0 rm
## Remove the files that were extracted mistakenly (zsh)
rm ~/.avfs/$PWD/foo.zip#/**/*(:"s~$HOME/.avfs/$PWD/foo.zip#~~"^/)
## Extract the contents where you really want them
cp -Rp ~/.avfs/"$PWD/foo.zip#" /intended/destination
umountavfs
Nach Datum
Angenommen, es gab keine andere Aktivität in derselben Hierarchie als Ihre Extraktion, können Sie die extrahierten Dateien anhand ihrer letzten ctime erkennen . Wenn Sie die ZIP-Datei gerade erstellt oder verschoben haben, können Sie sie als Cutoff verwenden. Verwenden Sie andernfalls ls -lctr
um eine geeignete Cutoff-Zeit zu bestimmen. Wenn Sie sicherstellen möchten, dass die Reißverschlüsse nicht entfernt werden, gibt es keinen Grund, eine manuelle Genehmigung vorzunehmen:find
durchaus in der Lage ist, sie auszuschließen. Hier sind Beispielbefehle mit zsh oder find
; Beachten Sie, dass die -cmin
und -cnewer
Vorwahlen sind nicht in POSIX, existieren aber unter Linux (und anderen Systemen mit GNU find), *BSD und OSX.
find . ! -name '*.zip' -type f -cmin -5 -exec rm {} + # extracted <5 min ago
rm **/*~*.zip(.cm-6) # zsh, extracted ≤5 min ago
find . -type f -cnewer foo.zip -exec rm {} + # created or moved after foo.zip
Mit GNU find, FreeBSD und OSX besteht eine andere Möglichkeit, die Cutoff-Zeit anzugeben, darin, eine Datei zu erstellen und touch
zu verwenden um seine mtime auf die Cutoff-Zeit zu setzen.
touch -d … cutoff
find . -type f -newercm cutoff -delete
Anstatt die Dateien zu entfernen, können Sie sie an ihren vorgesehenen Bestimmungsort verschieben. Hier ist eine Möglichkeit mit GNU/*BSD/OSX find, Verzeichnisse im Ziel nach Bedarf zu erstellen.
find . ! -name . -cmin -5 -type f -exec sh -c '
for x; do
mkdir -p "$0/${x%/*}"
mv "$x" "$0/$x"
done
' /intended/destination {} +
Zsh-Äquivalent (fast:dieses reproduziert die gesamte Verzeichnishierarchie, nicht nur die Verzeichnisse, die Dateien enthalten):
autoload zmv
mkdir -p ./**/*(/cm-3:s"|.|/intended/destination|")
zmv -Q '(**/)(*)(.cm-3)' /intended/destination/'$1$2'
Achtung, ich habe die meisten Befehle in dieser Antwort nicht getestet. Überprüfen Sie immer die Liste der Dateien, bevor Sie sie entfernen (führen Sie echo
aus zuerst, dann rm
wenn es in Ordnung ist).