Ich habe gerade ein Archiv entpackt, das ein Durcheinander von Dateien in meinem aufgeräumten Verzeichnis erzeugt hat. Beispielsweise:
user@comp:~/tidy$ tar xvf myarchive.tar
file1
file2
dir1/
dir1/file1
dir1/subdir1/
dir1/subdir1/file1
dir2/
dir2/file1
...
Ich hatte erwartet, dass die TAR-Datei in einem einzigen Ordner (dh myarchive/
) organisiert wäre, aber es war nicht! Jetzt habe ich ungefähr 190 Dateien und Verzeichnisse, die digital in ein organisiertes Verzeichnis verschoben wurden. Diese Dateien müssen bereinigt werden.
Gibt es eine Möglichkeit, dies rückgängig zu machen und die Dateien und Verzeichnisse zu löschen, die aus diesem Archiv extrahiert wurden?
Vielen Dank für die hervorragenden Antworten unten. Zusammenfassend funktioniert Folgendes mit zwei Schritten: (1) Löschen von Dateien und (2) Löschen der leeren Verzeichnisstruktur in umgekehrter Reihenfolge (Löschen der äußeren Verzeichnisse zuerst):
tar tf myarchive.tar | xargs -d'\n' rm
tar tf myarchive.tar | tac | xargs -d'\n' rmdir
Noch sicherer ist es, eine Vorschau der Befehle anzuzeigen, indem Sie sie echo
nachher anhängen xargs
.
xargs
(tac
stattsort -r
nur Kosmetik), aber Sie akzeptieren die Antwort mit Prozessersetzung, die, wie Sie in den Kommentaren erklärt haben, nicht zu Ihnen passte? Geben Sie außerdemxargs -d'\n'
in Ihrem Beitrag den Schalter an, wenn Sie eine Zusammenfassung für zukünftige Benutzer erstellen möchten, damit diese nicht von Leerzeichen in Dateinamen gebissen werden.-d'\n'
bis jetzt nie verstanden , und nach weiterer Analyse ist Ihre Antwort tatsächlich näher an dem, was ich verwendet habe.-d'\n'
liegt in der Tatsache, dass, wenn Sie nicht sagenxargs
, Argumente in neue Zeilen aufzuteilen (was Sie einspeisen), sondern in Leerzeichen, dann eine Datei mit dem Namefolder1/some file
wird alsfolder1/some
und gelesenname
.Antworten:
listet den Inhalt zeilenweise auf.
Dies kann
xargs
direkt weitergeleitet werden, aber Vorsicht : Führen Sie den Löschvorgang sehr sorgfältig durch. Sie wollen nicht nurrm -r
alles, wastar tf
Ihnen sagt, da es möglicherweise Verzeichnisse enthält, die vor dem Entpacken nicht leer waren!Du könntest es tun
Entfernen Sie zuerst alle Dateien, die sich im Archiv befanden, und anschließend die leeren Verzeichnisse.
sort -r
(glennjackman schlug vor,tac
anstattsort -r
in den Kommentaren auf die akzeptierte Antwort zu antworten, was auch funktioniert, datar
die Ausgabe regelmäßig genug ist) wird benötigt, um die tiefsten Verzeichnisse zuerst zu löschen; Andernfalls wird ein Fall, in demdir1
ein einzelnes leeres Verzeichnis enthaltendir2
ist,dir1
nach demrmdir
Durchlauf verlassen, da es zuvor nicht leerdir2
war und entfernt wurde.Dies wird viel erzeugen
und
Halt die
2>/dev/null
Klappe, wenn es dich nervt, aber ich würde es vorziehen, so viele Informationen wie möglich über den Prozess zu behalten.Und tun Sie das erst, wenn Sie sicher sind, dass Sie die richtigen Dateien gefunden haben. Und versuchen Sie vielleicht
rm -i
, alles zu bestätigen. Und sichern Sie sich, frühstücken Sie, putzen Sie sich die Zähne usw.quelle
-d'\n'
Option zu übergebenxargs
.xargs
keine hat-d
, so dass Sie die GNU-Variante benötigen, wenn Sie eine arme Seele wie ich sind.Listen Sie den Inhalt der tar-Datei folgendermaßen auf:
Löschen Sie dann diese Dateinamen, indem Sie diese Liste durchlaufen:
Dies listet immer noch nur die Dateien auf, die gelöscht werden würden. Ersetzen Sie
echo
durch,rm
wenn Sie wirklich sicher sind, dass Sie diese entfernen möchten. Und vielleicht machen Sie ein Backup, um sicherzugehen.Entfernen Sie in einem zweiten Durchgang die verbleibenden Verzeichnisse:
Auf diese Weise wird verhindert, dass Verzeichnisse mit gelöscht werden, wenn sie zuvor bereits vorhanden waren.
Ein weiterer netter Trick von @glennjackman, bei dem die Reihenfolge der Dateien beibehalten wird, beginnend mit den tiefsten. Wieder entfernen,
echo
wenn Sie fertig sind.Darauf könnte dann die normale
rmdir
Bereinigung folgen .quelle
while
einer Schleife über eine Reihe von Datensätzen verwendet wird. Ich habe mich gerade daran gewöhnt. @ stérm -rf
Dateien gelöscht werden können, die nicht aus dem Archiv stammen, sondern sich in einem Verzeichnis befinden, das denselben Namen hat wie eines aus dem Archiv. Sei hier besser vorsichtig und benutze esrmdir
in einem zweiten Durchgang.rmdir
für jede Ebene der Verschachtelung von Verzeichnissen ausgeführt werden. So wird essubdir1
beim ersten Durchlauf bereinigt , aber verlassen,dir1
da es versucht hat, dies zuerst zu löschen, als es zu der Zeit noch nicht leer war. Dieser Befehl kann einmal ausgeführt werden, wenn die Dateiliste rücksortiert werden kann.tar tvf arch.tar | tac | xargs echo rm
(Entfernen Sie das Echo, wenn Sie sicher sind)Hier ist eine Möglichkeit, die extrahierten Dateien in ein Unterverzeichnis zu verschieben und den Hauptordner zu bereinigen.
Speichern Sie dies in der Datei
fix-tar.pl
und führen Sie es dann wie folgt aus:Dadurch wird bestätigt, dass Ihre
tar
Liste meiner entspricht. Sie sollten eine Ausgabe wie folgt erhalten:Wenn das gut aussieht, dann starte es nochmal so:
Das
fixup.sh
Skript besteht aus den Shell-Befehlen, mit denen die Dateien und Verzeichnisse der obersten Ebene in einen "sauberen" Ordner verschoben werden (in diesem Fall in den aufgerufenen Ordnercleanup
). Werfen Sie einen Blick in dieses Skript, um zu bestätigen, dass alles koscher ist. Wenn dies der Fall ist, können Sie jetzt Ihr Chaos aufräumen mit:Ich bevorzuge diese Art der Bereinigung, weil sie nichts zerstört, was noch nicht durch das Überschreiben mit dieser Initiale zerstört wurde
tar xv
.Hinweis: Wenn die anfängliche Trockenlaufausgabe nicht richtig aussieht, sollten Sie in der Lage sein, mit den Zahlen in den beiden
substr
Funktionsaufrufen zu fummeln, bis sie richtig aussehen. Die$perms
Variable wird nur für den Probelauf verwendet, sodass wirklich nur der$dirent
Teilstring korrekt sein muss.Eine andere Sache: Möglicherweise müssen Sie diese
tar
Option verwenden,--numeric-owner
wenn die Benutzernamen und / oder Gruppennamen in dertar
Liste dazu führen, dass die Namen in einer unvorhersehbaren Spalte beginnen.quelle
Diese Art von (asozialem) Archiv wird aufgrund ihrer Funktion als Teerbombe bezeichnet. Sobald eine dieser "Explosionen" bei Ihnen auftritt, sind die Lösungen in den anderen Antworten weitaus besser als von mir vorgeschlagen.
Die beste "Lösung" besteht jedoch darin, das Problem zunächst zu vermeiden.
Der einfachste (faulste) Weg, dies zu tun, besteht darin, ein tar-Archiv immer in ein leeres Verzeichnis zu entpacken. Wenn es ein Verzeichnis der obersten Ebene enthält, verschieben Sie es einfach an das gewünschte Ziel. Wenn nicht, benennen Sie einfach Ihr Arbeitsverzeichnis (das leere) um und verschieben Sie es an den gewünschten Ort.
Wenn Sie es nur beim ersten Mal richtig machen möchten, können Sie tar -tvf archive-file.tar | ausführen In diesem Fall wird der Inhalt des Archivs aufgelistet, sodass Sie sehen können, wie es strukturiert ist, und anschließend die erforderlichen Schritte ausführen, um es an den gewünschten Speicherort zu extrahieren.
Die Option t ist auch nützlich, wenn Sie den Inhalt eines Archivs überprüfen möchten, um festzustellen, ob sich darin etwas befindet, nach dem Sie suchen. In diesem Fall können Sie optional nur die gewünschten Dateien extrahieren.
quelle