web-dev-qa-db-fra.com

Interception des appels vers rm et commande de placer les fichiers supprimés dans la corbeille

Existe-t-il un moyen d'intercepter les appels de rm et, au lieu de supprimer définitivement les fichiers, de les déplacer vers la corbeille?

10
dzhelil

Il y a un recette sur webupd8.org pour cela. Pour prévenir la pourriture des liens, voici les informations importantes (avec quelques ajouts).

Sudo apt-get install trash-cli

Ceci installera les commandes trash, empty-trash, list-trash et restore-trash, que vous pouvez utiliser tels quels ou faire de rm un alias de trash. (voir ci-dessous).

La sémantique de la commande trash est un peu différente de la norme rm - elle n’exige pas le drapeau -r pour pouvoir supprimer des répertoires. Si cela vous dérange, webupd8.org propose le script suivant, que vous pouvez mettre dans votre PATH et l'appeler 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[@]}"

Dans Ubuntu 12.04 et les versions ultérieures, la dernière commande du script devrait être trash-put "${cmd[@]}" au lieu de trash "${cmd[@]}" (car la commande est passée de trash à trash-put).

Ensuite, rendre le script exécutable:

chmod +x trash-rm

Une fois que vous l'avez dans un répertoire de votre PATH, ajoutez un alias à votre ~/.bashrc, ce qui obligera bash à appeler votre script à la place de la commande rm actuelle:

alias rm="trash-rm"

Comme le souligne correctement djeikyb, l'astuce d'alias .bashrc ne fonctionnerait que pour l'utilisateur dont le fichier .bashrc est modifié, et uniquement lors d'une session de terminal bash.

Et ça devrait être ça.

13
Sergey

libtrash (le paquet libtrash dans Ubuntu) semble le faire, mais je ne l'ai jamais utilisé.

0
Florian Diesch