Ich habe eine Zip-Datei in einen nicht leeren Ordner extrahiert. Die ZIP-Datei enthält viele Dateien und eine tiefe Hierarchie, die mit dem vorhandenen Baum des Zielverzeichnisses zusammengeführt wird. Wie kann ich die Dateien und Verzeichnisse entfernen, die durch Entpacken erstellt wurden, ohne die bereits vorhandenen Dateien und Verzeichnisse zu zerstören? Natürlich habe ich immer noch die Zip-Datei, in der ich zusammengeführt habe, also sind die Informationen dort.
52
lq
Optionen für nichtunzizp
, ich habe nur einige klassische * nix-Tricks um seine Hauptantwort hinzugefügt.foo.tds.zip
Form vorliegen. Diese Reißverschlüsse verschmelzen zu einem TEXMF-Baum, was sehr praktisch ist. Wenn Sie jedoch jemals ein solches Paket entfernen möchten, stehen Sie vor dem von mir beschriebenen Problem.Antworten:
jjlins antwort ist der richtige weg. Ich möchte nur ein paar Auswahlmöglichkeiten für Verzeichnisse hinzufügen:
Löschen Sie alle extrahierten Dateien, keine Verzeichnisse :
Löschen Sie nur extrahierte Dateien und leere Verzeichnisse
Wenn keine Optionen
rmdir
verfügbar sind, werden nur leere Verzeichnisse gelöscht. Dateien und nicht leere Ordner bleiben in Ruhe, sodass Sie sie sicher ausführen können*
.Löschen Sie alles , was extrahiert wurde, aber fordern Sie vor jedem Löschen eine Bestätigung an:
Das
-i
Flagrm
fordert vor jedem Entfernen dazu auf, Ja oder Nein zu wählen.Löschen Sie alles , was extrahiert wurde, einschließlich der Verzeichnisse:
quelle
find
:find * -depth -type d -exec rmdir {} +
und ignoriert alleDirectory not empty
Nachrichten. Es könnte legal sein, dies zu verkürzen,find * -type d -delete
wenn die-delete
Option aktiviert wird,-depth
aber ich habe nicht überprüft, dass-delete
ein nicht leeres Verzeichnis nicht gelöscht wird.find: cannot delete './foo': Directory not empty
Mit können Sie
unzip -lqq <filename.zip>
den Inhalt der ZIP-Datei auflisten. Dies wird jedoch einige irrelevante Informationen enthalten, die herausgefiltert werden müssen. Hier ist ein Befehl, der für mich funktioniert:Der
awk
Befehl extrahiert nur die Namen der Dateien und Verzeichnisse. Dann wird das Ergebnis an übergebenxargs
, um alles zu löschen. Ich empfehle, zuerst einen Probelauf des Befehls durchzuführen (dh denxargs rm -rf
Teil wegzulassen ), um sicherzustellen, dass die Ergebnisse korrekt sind.Der obige Befehl hat Probleme mit Pfaden mit Leerzeichen. Diese (kompliziertere) Version sollte Folgendes beheben:
quelle
unzip -lqq
listet aber auch die im zip enthaltenen Verzeichnisse auf. Vorerst würde ich alle Verzeichnisse in Ruhe lassen. Das Löschen aller leeren Verzeichnisse in einem Baum kann eine weitere Frage sein.grep -v '/$'
in die Pipeline hinzufügen , um das Löschen der Verzeichnisse (die alle einen abschließenden Schrägstrich (AFAICT) haben) zu überspringen.awk
, da beim Drucken von nur 4 Euro nicht der vollständige Pfad gedruckt wird.-r
Option von rm verwenden sollten: das scheint Probleme zu bereiten, besonders wenn es mit der-f
Option kombiniert wird .-f
In diesem Szenario würde ich die Option überhaupt nicht verwenden .grep -v '/$'
nur Verzeichniseinträge in der ZIP-Datei aus. Sie enthalten weiterhin Einträge, die reine Dateien in der ZIP-Datei waren, jedoch bereits vorhandene Verzeichnisse im Zielordner. Aus diesem Grund wäre es klug, wegzulassen-r
Mit dem Schalter
-Z1
wird beim Entpacken genau eine Datei pro Zeile aufgelistet (und sonst nichts).Auf diese Weise können Sie verwenden
um alle aus der zip-Datei extrahierten Dateien zu löschen.
Der Befehl
löscht auch Verzeichnisse, aber Sie müssen vorsichtig sein. Wenn die Verzeichnisse vor dem Extrahieren der ZIP-Datei bereits vorhanden waren, werden auch alle in diesen Verzeichnissen vorhandenen Dateien gelöscht.
Wenn Sie die ZIP-Datei trotzdem erneut extrahieren, gibt es einen anderen Ansatz, der mit seltsamen Dateinamen umgeht.
Extrahieren Sie zuerst die Zip-Datei, in die Sie sie ursprünglich extrahieren wollten:
Wechseln Sie nun in das Verzeichnis, in das Sie versehentlich die Dateien extrahiert haben, und führen Sie den folgenden Befehl aus:
-type f
findet nur Dateien (keine Verzeichnisse).%P\0
ist der relative Pfad (ohneelsewhere/
), gefolgt von einem Nullzeichen.-0
Legt fest, dass XARGs Zeilen durch Nullzeichen trennen. Dies ist zuverlässiger, da Dateinamen theoretisch Zeilenumbrüche enthalten können.Um mit verbliebenen Verzeichnissen umzugehen, können Sie den folgenden Befehl ausführen:
-type d
findet nur Verzeichnisse.-exec rmdir -p {} \;
wirdrmdir -p {}
für jedes gefundene Verzeichnis ausgeführt.{}
ist das gefundene Verzeichnis, und der-p
Schalter veranlasst rmdir, auch die leeren übergeordneten Verzeichnisse zu entfernen.2> /dev/null
Unterdrückt die Fehlermeldungen, die beim Versuch auftreten, nicht leere oder zuvor gelöschte Verzeichnisse zu löschen.Verwandte Manpages:
quelle
zipinfo
Manpage von gelesen habe .Hier ist eine noch einfachere und sicherere (glaube ich) Lösung
Vorgehensweise: Mit dem Befehl "Entpacken in Anführungszeichen" wird eine Liste der in Ihrer Originaldatei enthaltenen Elemente erstellt.
zip -m verwendet diese Liste dann, um add that each zu getmeoutofhere.zip hinzuzufügen und aus dem Originalverzeichnis zu entfernen (theoretisch sollte es also indentiell zu myoriginalfile.zip sein).
Der Nachteil ist, dass unzip -lqq zusätzlichen Text, Datumsangaben, Uhrzeiten, Dateigröße usw. erzeugt. Dies führt dazu, dass zip -m Fehlermeldungen ausgibt, die sich jedoch nicht auswirken sollten (es sei denn, Sie haben den unwahrscheinlichen Fall einer Datei mit derselben Name).
Beachten Sie, dass dadurch keine Verzeichnisse entfernt werden, die beim ursprünglichen Entpacken erstellt wurden.
quelle
Wenn Sie die Dateien so extrahiert haben, dass der Änderungszeitstempel im Archiv nicht in den extrahierten Kopien erhalten bleibt (die extrahierten Dateien haben jedoch die übliche Änderungszeit), können Sie dies über die Änderungszeit angreifen. Alle extrahierten Dateien haben einen neueren Änderungszeitstempel als die zuletzt geänderte vorhandene Datei in diesem Verzeichnis.
Hier ist eine einfache Situation.
Angenommen, keine der im aktuellen Verzeichnis vorhandenen Dateien wurde mindestens 24 Stunden lang berührt. Alles, was in den letzten 24 Stunden geändert wurde, ist daher Müll aus der Zip-Datei.
Dadurch werden auch einige Verzeichnisse gefunden, die jedoch
rm
in Ruhe gelassen werden. Sie können in einem zweiten Durchgang behandelt werden:Alle Verzeichnisse, die kürzlich geändert wurden, wurden vom zip geändert. Wenn sie
rmdir
erfolgreich entfernt wurden, sind sie leer. Leere Verzeichnisse, die von zip berührt wurden, wurden wahrscheinlich von zip erstellt: dh kamen aus dem Archiv. Wir können nicht 100% sicher sein. Es ist möglich, dass beim Entpacken einige Dateien in ein vorhandenes Verzeichnis verschoben wurden, das leer war.Wenn
find
die 24-Stunden-Granularität für den Job nicht ausreicht, weil die Dateien im Baum zu spät geändert wurden, würde ich als Nächstes etwas Einfaches betrachten: Angenommen, der Entpack-Job hat nichts in vorhandene Unterverzeichnisse verschoben. Das heißt, alles, was entpackt wurde, ist entweder eine Datei auf der obersten Ebene oder ein neues Unterverzeichnis, das vorher nicht vorhanden war und daher nichts als Material aus dem Zip enthält. Dann:Nun öffnen wir uns
filelist
in einem Texteditor und ermitteln den ersten Eintrag in der Liste, der nicht aus der zip stammt. Wir löschen diesen Eintrag und alles andere danach. Was bleibt, sind die Dateien und Verzeichnisse, die aus dem Zip stammen. Zunächst untersuchen wir visuell, ob Leerzeichen in den Namen oder Anführungszeichen vorhanden sind, die maskiert werden müssen. Bei Bedarf können wir dann alles in Anführungszeichen setzen: Im Folgenden wird davon ausgegangen, dass Sie Vim verwenden:Dann verbinde alles zu einer großen Linie:
Fügen Sie nun
rm -rf
davor ein:Führen Sie die Zeile unter dem Cursor als Shell-Befehl aus:
Auf jeden Fall würde ich die Schritte dieser Aufgabe nicht automatisieren, da die Gefahr besteht, dass bereits vorhandene Dateien gelöscht oder aufgrund von Dateinamenproblemen Fehler gemacht werden.
Wenn Sie den naheliegenden Weg gehen, eine Liste der Pfade in der ZIP-Datei zu erhalten, erfassen Sie diese in einer Datei, überprüfen Sie sie sorgfältig und wandeln Sie sie nach der erforderlichen Bearbeitung in eine Löschung um.
quelle