Przechwytywanie połączeń do rm i kierowanie usuniętych plików do kosza

10

Czy istnieje sposób przechwytywania wywołań rm i zamiast trwałego usuwania plików, przenoszenie ich do kosza?

dzhelil
źródło
Jak uniwersalny pytasz? Czy masz na myśli każde wywołanie RM przez każdego użytkownika lub proces? A może tylko dla ciebie, gdy używasz bash? Lub ..
djeikyb

Odpowiedzi:

13

Jest na to przepis na webupd8.org . Aby zapobiec gniciu linków, oto ważna informacja (z kilkoma dodatkami).

sudo apt-get install trash-cli

Będzie to zainstalować trash, empty-trash, list-trashi restore-trashpolecenia, które można użyć, jak jest lub czynią rmalias trash(patrz niżej).

Semantyka trashpolecenia jest nieco inna niż standardowa rm- nie wymaga -rflagi, aby móc usunąć katalogi. Jeśli Ci to przeszkadza, webupd8.org proponuje następujący skrypt, który możesz umieścić w swojej ŚCIEŻCE i wywołać 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[@]}"

W systemie Ubuntu 12.04 i nowszych ostatnia komenda w skrypcie powinna być trash-put "${cmd[@]}"zamiast trash "${cmd[@]}"(ponieważ komenda zmieniła się z trashna trash-put).

Następnie uczyń skrypt wykonywalnym:

chmod +x trash-rm

Gdy znajdziesz go w jakimś katalogu w swoim katalogu PATH, dodaj do swojego ~ / .bashrc alias, który sprawi, że bash wywoła twój skrypt zamiast rzeczywistego rmpolecenia:

alias rm="trash-rm"

Jak słusznie wskazuje djeikyb, sztuczka aliasowa .bashrc działałaby tylko dla użytkownika, którego zmodyfikowano .bashrc, i tylko w sesji terminalu bash.

I to powinno być to.

Siergiej
źródło
To dobra odpowiedź, ale byłoby jeszcze lepiej, gdybyś ją zreorganizował, aby podkreślić główną koncepcję użycia aliasu. Myślę, że najważniejsze jest, aby zrozumieć, jak „przechwycić” RM. To, co dzieje się na jego miejscu, można dostosować na wiele sposobów.
djeikyb
Warto też wspomnieć, że wpływa to tylko na polecenie rm dla sesji bash użytkownika.
djeikyb
@djeikyb: dzięki za sugestie, zaktualizowałem odpowiedź
Sergey
Działa świetnie dla mnie bez skryptu (właśnie zainstalowany i dodany alias="trash"). Czy wiesz, jaka jest zaleta posiadania skryptu?
desgua
@desgua: celem skryptu jest trashzachowanie się podobnie rmdo usuwania katalogów. Może to być ważne na przykład w przypadku niektórych skryptów, które oczekują rmdziałania w taki sposób. Zaktualizowałem odpowiedź.
Siergiej
0

Wydaje się, że libtrash (pakiet libtrash w Ubuntu) to robi, ale nigdy go nie używałem.

Florian Diesch
źródło