Frage Wie entfernen Sie alle Teile einer geteilten RAR-Archivdatei über die Befehlszeile?


Ich verwende normalerweise eine Debian-basierte Linux-Distribution irgendeiner Art; entweder Debian 7.8 oder Linux Mint 17. Ich habe eine geteilte RAR-Datei wie folgt:

filename.rar
filename.r01
filename.r02
filename.r03
etc ...

Entnehmen des Archivs mit dtrx oder unrarIch möchte alle Teildateien des geteilten Archivs löschen, vorzugsweise mit einer einzelnen Zeile.

Im Moment tue ich es rm filename.r*, die im Allgemeinen gut funktioniert, jedoch wenn die Dateien wie Name sind rabbid.ranger.robot.r01 Es kann das extrahierte Verzeichnis löschen rabbid.ranger.robot auch.

Ich suche also etwas robusteres.

Wird auch ein kurzes Skript akzeptieren.


6
2018-04-05 23:53


Ursprung




Antworten:


Abhängig von der Anzahl von .r0* Dateien, die Sie haben, könnten Sie ersetzen * mit einem ? Dies wird Dateien entfernen, die .r0 und 1 anderes Zeichen haben. So wird es entfernen rabbid.ranger.robot.r01 aber nicht rabbid.ranger.robot.r010 Generell würde ich es so verwenden:

rm filename.r??

6
2018-04-06 00:23





Angenommen, Sie haben einen geteilten RAR mit Teilen, die bis zu 12 nummeriert sind (d. H. filename.r12 als Ihre letzte Datei) und Sie möchten besonders vorsichtig sein, nicht zu entfernen irgendein andere Dateien. Angenommen bash ist deine Schale und du verwendest Version 4 oder höher (bash --version um zu überprüfen), können Sie leicht eine explizite Liste von Dateien mit erstellen Klammer Erweiterung:

rm filename.rar filename.r{01..12}

Dies wird entfernt nur diese Dateien: sogar Dateien mit Namen filename.rtf (oder filename.r13) wird geschont. Je nachdem, welche anderen Dateien Sie im Ordner haben (oder haben), ist dies möglicherweise vorzuziehen das ist normalerweise ziemlich gut .r?? Weg von Devan vorgeschlagen.

Brace-Erweiterung, einschließlich numerischer Bereiche, ist ein sehr altes Feature von mehreren Shells. Aber vor Version 4 unterstützt bash kein Zero-Padding (d. H. Namen wie filename.r05nicht filename.r5).

Sie können zuerst prüfen, um welche Dateinamen ein Klammerausdruck erweitert wird:

$ echo filename.rar filename.r{01..12}
filename.rar filename.r01 filename.r02 filename.r03 filename.r04 filename.r05 filename.r06 filename.r07 filename.r08 filename.r09 filename.r10 filename.r11 filename.r12

(Sie können Ausdrücke mit überprüfen * oder ? auch auf diese Weise - denken Sie daran, dass das, worauf es erweitert wird, davon abhängt, in welchem ​​Ordner Sie sich befinden, wenn Sie den Befehl ausführen.


10
2018-04-06 03:03



Zwei sehr gute Antworten, schwer zu wählen zwischen ihnen. Ich werde sicherlich diese Funktion von bash auch verwenden. Ich fühlte, dass Devan's Antwort den Vorteil hatte, obwohl diese Antwort nicht zu schmälern war. - fswings


Du kannst den ... benutzen find Befehl; aus dem Arbeitsverzeichnis:

find . -type f -name "filename.*" -exec rm  {} \;

Dies sucht nur nach Dateien, die übereinstimmen, Verzeichnisse sind ausgeschlossen. Es kann eine gute Idee sein, den Befehl zuerst mit zu testen ls eher, als rm um sicherzustellen, dass es die gewünschten Ergebnisse liefert.

find . -type f -name "filename.*" -exec ls {} \;

4
2018-04-06 00:17



Aber rm (ohne -r) ebenfalls schließt Verzeichnisse aus. Dies find Weg hat keinen Vorteil gegenüber rm filename.r*, welches fswings versucht, sich zu verbessern. rm filename.r* löscht so viel, wie das OP löschen möchte (und möglicherweise mehr); diese Methode mit find löscht mindestens so viel wie rm filename.r*, und manchmal mehr schon seit find ist rekursiv (d. h. es geht in Unterverzeichnisse über und löscht Dateien dort und in ihr Unterverzeichnisse usw.). Sie könnten es auf den Inhalt von beschränken .beim Hinzufügen -maxdepth 1, aber es hätte immer noch keine Vorteile gegenüber rm filename.r*.