Abfangen von Aufrufen an rm und Weiterleiten gelöschter Dateien in den Papierkorb

10

Gibt es eine Möglichkeit, Aufrufe von rm abzufangen und die Dateien nicht dauerhaft zu löschen, sondern in den Papierkorb zu verschieben?

dzhelil
quelle
Wie universell fragst du? Meinen Sie für jeden rm-Anruf von jedem Benutzer oder Prozess? Oder nur für Sie, während Sie Bash verwenden? Oder ..
djeikyb

Antworten:

13

Dafür gibt es auf webupd8.org ein Rezept . Um Link Rot zu verhindern, finden Sie hier die wichtigen Informationen (mit einigen Ergänzungen).

sudo apt-get install trash-cli

Dies installiert trash, empty-trash, list-trashund restore-trashBefehle, die Sie verwenden können , wie sie ist oder machen rmeinen Alias trash(siehe unten).

Die Semantik des trashBefehls unterscheidet sich ein wenig vom Standard rm- es ist kein -rFlag erforderlich , um Verzeichnisse löschen zu können. Wenn Sie dies stört, schlägt webupd8.org das folgende Skript vor, das Sie in Ihren PATH einfügen und aufrufen können trash-rm:

#!/bin/bash
# command name: trash-rm
shopt -s extglob
recursive=1
declare -a cmd
((i = 0))
for f in "$@"; do
    case "$f" in

        (-*([fiIv])r*([fiIv])|-*([fiIv])R*([fiIv]))
            tmp="${f//[rR]/}"
            if [ -n "$tmp" ]; then
                #echo "\$tmp == $tmp"
                cmd[$i]="$tmp"
                ((i++))
            fi
            recursive=0
        ;;

        (--recursive) recursive=0
        ;;

        (*)
            if [ $recursive != 0   -a  -d "$f" ]; then
                echo "skipping directory: $f"
                continue
            else
                cmd[$i]="$f"
                ((i++))
            fi
        ;;

    esac
done
trash "${cmd[@]}"

In Ubuntu 12.04 und höher sollte der letzte Befehl im Skript trash-put "${cmd[@]}"anstelle von sein trash "${cmd[@]}"(da sich der Befehl von trashzu geändert hat trash-put).

Dann machen Sie das Skript ausführbar:

chmod +x trash-rm

Sobald Sie es in einem Verzeichnis in Ihrem haben PATH, fügen Sie Ihrem ~ / .bashrc einen Alias ​​hinzu, der bash veranlasst, Ihr Skript anstelle des eigentlichen rmBefehls aufzurufen :

alias rm="trash-rm"

Wie djeikyb richtig hervorhebt, funktioniert der Alias-Trick .bashrc nur für den Benutzer, dessen .bashrc geändert wurde, und nur in einer Bash-Terminalsitzung.

Und das sollte es sein.

Sergey
quelle
Dies ist eine gute Antwort, aber es wäre noch besser, wenn Sie sie neu organisieren, um das Hauptkonzept der Verwendung eines Alias ​​hervorzuheben. Ich denke, es ist am wichtigsten zu verstehen, wie man rm "abfängt". Was an seiner Stelle passiert, kann auf verschiedene Arten angepasst werden.
Djeikyb
Es wäre auch gut zu erwähnen, dass dies nur den Befehl rm für die Bash-Sitzung des Benutzers betrifft.
Djeikyb
@djeikyb: Danke für die Vorschläge, ich habe die Antwort aktualisiert
Sergey
Es funktioniert gut für mich ohne das Skript (nur installiert und hinzugefügt alias="trash"). Wissen Sie, was der Vorteil des Skripts ist?
Desgua
@desgua: Der Zweck des Skripts besteht darin, trashdas Verhalten rmbeim Löschen von Verzeichnissen ähnlicher zu gestalten. Dies kann beispielsweise für einige Skripte wichtig sein, die voraussichtlich rmso funktionieren, wie sie funktionieren. Ich habe die Antwort aktualisiert.
Sergey
0

libtrash (Paket libtrash in Ubuntu) scheint dies zu tun, aber ich habe es nie benutzt.

Florian Diesch
quelle