Hi Leute,
Warum überhaupt?
Manche kennen ja vielleicht dieses Problem: Man ist, der eine häufiger, der andere seltener (ich gehöre eher zu denen die es häufiger sind), im Terminal und möchte irgend eine Datei löschen. Also tippt man rm ein... Der Pfad zur Datei/zum Verzeichnis folgt... Und man vertippt sich. Blöderweise merkt man das erst nachdem man die Enter-Taste gedrückt hat und ärgert sich nun darüber, dass etwas verschwunden ist was nicht hätte verschwinden sollen. In jedem Fall ärgert man sich erst mal in Grund und Boden, danach holt man entweder die Backups raus oder versucht sich an Programmen wie extundelete. Beides kostet unnötig viel Zeit und beides hat so seine Tücken: Backups sind notorisch zu alt und solche Recovery-Tools finden notorisch nur die Dateien die man nicht sucht.
Mir ist das erst vor ein paar Wochen passiert: ich wollte "rm irgend/ein/pfad/dateien_mit_*" tippen, habe aber "rm irgend/ein/pfad/dateien_mit *" getippt - und schwupps waren alle Dateien in meinem Home-Verzeichnis weg. Ich hatte zwar aktuelle Backups mit denen ich die Dateien in der richtigen Version wiederherstellen konnte, blöderweise hatte ich ausgerechnet am vorherigen Tag eine wichtige Datei angelegt und erst am nächsten Tag wäre ein regelmäßiges Backup angestanden... Die Arbeit war also futsch. Gut, die meist angewandte Lösung ist in die .bashrc einen Alias mit "rm -I" zu legen: Dadurch wird man immer brav gefragt ob man die Aktion wirklich durchführen möchte - also zumindest wenn man rekursiv oder mehr als drei Parameter löschen möchte. Ich persönlich finde das recht störend, außerdem kenne ich mich: am Ende drücke ich automatisch y und die Schutzfunktion ist dahin...
Die Lösung: Der Papierkorb! Wie wär's mit dem trash-Kommando?
Dann ist mir eingefallen dass man den Papierkorb auch im Terminal nutzen kann. Der Befehl heißt trash (auf Desktop-System vorinstalliert, auf dem Server muss er nachinstalliert werden - imho auf Servern aber wenig sinnvoll). Löscht man etwas versehentlich holt man die Datei einfach wieder aus dem Papierkorb und fertig... Geleert wird der Papierkorb bei mir immer erst wenn der Speicher knapp wird, also sehr sehr selten - das stört also nicht. Schaut man sich trash --help an wird man aber enttäuscht... Da steht zwar etwas von Kompatibilität zu rm, die ist aber eher ein Witz: trash löscht nicht nur Dateien sondern immer auch Verzeichnisse, es wird immer rekursiv gelöscht und die manchmal sehr praktischen Interaktionsmöglichkeiten mit rm fehlen komplett.
Das Skript
Also habe ich mich hingesetzt und einen Kompatibilitäts-Layer geschrieben. Es werden alle Optionen von GNUs rm unterstützt - und zwar genau so wie auch bei rm, selbst die Ausgaben sind identisch (Verbose-Meldungen logischerweise nicht). Löscht man rekursiv wird der Befehl genau so dimensioniert, dass nicht die einzelnen Dateien im Papierkorb landen sondern möglichst die übergeordneten Verzeichnisse (wichtig wenn man interaktiv löscht oder das Flag --one-file-system gesetzt hat). Der Layer unterstützt auch das Löschen in nicht-interaktiven Shells, ist theoretisch also als kompletter Ersatz für rm geeignet. Das empfehle ich aber ausdrücklich nicht, ich warne sogar davor - der Papierkorb würde schnell überlaufen und die Performance einbrechen! Diese Unterstützung dient eher dazu, dass man einzelnen selbst geschriebenen Skripten erlauben kann den Layer zu nutzen. Noch ein Satz zur Performance: Der Befehl löscht die Dateien/Verzeichnisse nicht sondern verschiebt sie in den Papierkorb. Dieser ist zwar immer auf dem gleichen Dateisystem, geht also noch immer unmerklich schnell - dennoch, dass Verschieben eine geringere Performance hat als Löschen sollte klar sein. Der Layer ist in Bash geschrieben. Ich hatte zunächst nicht erwartet dass es so komplex wird, im Nachhinein wäre C++ sinnvoller gewesen - das ist mir aber blöderweise erst aufgefallen als eine Portierung noch mehr Aufwand bedeutet hätte.
Meine Anwendungsempfehlung ist das Skript unter /usr/local/bin/rmtrash abzulegen, ausführbar zu machen und in der .bashrc einen Alias für rm anzulegen. Schon wird euch in neu geöffneten Terminals der Befehl "rm --help" das Selbe wie "rmtrash --help" ausgeben. Zur Erinnerung: Die .bashrc gilt nur in von euch geöffneten Terminals. In Skripten (auch wenn es ein Bash-Skript ist und auch wenn es aus dem Terminal heraus gestartet wurde) wird rm wie gehabt zu /bin/rm führen. Sie gilt auch nicht in anderen Shells wie zsh. Um den Alias zu aktivieren einfach der ~/.bashrc (alternativ der ~/.bash_aliases) das hier hinzufügen:
1 | alias rm='/usr/local/bin/rmtrash' |
Das Skript findet ihr hier: https://github.com/PhrozenByte/rmtrash
rmdir
Übrigens: Das Gleiche gibt es auch für rmdir - also zum löschen leerer Verzeichnisse. Auch hier ist vollständige Kompatibilität zu GNUs rmdir gegeben und der Layer verhält sich auch exakt so. Der Ablauf zur Installation ist genauso wie auch bei rmtrash, das Skript findet ihr hier: https://github.com/PhrozenByte/rmtrash
Ich freue mich über Feedback - sowohl positive als auch konstruktive negative! Wenn ihr Fehler entdeckt: Immer nur her damit ☺
Viel Spaß damit und Grüße,
Rudi
Bearbeitet von redknight:
Links auf neues Ziel angepasst.