Intercettare le chiamate a rm e indirizzare invece i file eliminati nel cestino


10

C'è un modo per intercettare le chiamate a rm e invece di eliminare definitivamente i file, spostandoli nel cestino?


Quanto universale stai chiedendo? Intendi per ogni chiamata rm da ogni utente o processo? O solo per te mentre usi bash? Oppure ...
djeikyb,

Risposte:


13

C'è una ricetta su webupd8.org per questo. Per prevenire la putrefazione dei link, ecco le informazioni importanti (con alcune aggiunte).

sudo apt-get install trash-cli

Questo installerà trash, empty-trash, list-trashe restore-trashcomandi, che è possibile utilizzare così come sono o fare rmun alias di trash(vedi sotto).

La semantica del trashcomando è un po 'diversa rispetto allo standard rm: non richiede -rflag per poter eliminare le directory. Se questo ti dà fastidio, webupd8.org ti propone il seguente script, che puoi inserire nel tuo PERCORSO e chiamarlo 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 e versioni successive, l'ultimo comando nello script dovrebbe essere trash-put "${cmd[@]}"invece di trash "${cmd[@]}"(poiché il comando è cambiato da trasha trash-put).

Quindi rendere eseguibile lo script:

chmod +x trash-rm

Una volta che lo hai in qualche directory nel tuo PATH, aggiungi un alias al tuo ~ / .bashrc, che farà bash per invocare il tuo script invece del rmcomando effettivo :

alias rm="trash-rm"

Come sottolinea correttamente djeikyb, il trucco dell'alias .bashrc funzionerebbe solo per l'utente il cui .bashrc è stato modificato, e solo nella sessione terminale bash.

E questo dovrebbe essere tutto.


Questa è una buona risposta, ma sarebbe ancora meglio se lo riorganizzassi per enfatizzare il concetto principale di utilizzo di un alias. Penso che sia molto importante capire come "intercettare" rm. Ciò che accade al suo posto può essere personalizzato in vari modi.
djeikyb,

Inoltre, sarebbe utile menzionare che ciò influisce solo sul comando rm per la sessione bash dell'utente.
djeikyb,

@djeikyb: grazie per i suggerimenti, ho aggiornato la risposta
Sergey

Funziona benissimo per me senza lo script (appena installato e aggiunto alias="trash"). Sai qual è il vantaggio di avere la sceneggiatura?
desgua,

@desgua: lo scopo dello script è trashdi comportarsi in modo più simile rmall'eliminazione delle directory. Questo può essere importante per alcuni script che prevedono rmdi funzionare in questo modo, ad esempio. Ho aggiornato la risposta.
Sergey,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.