Intercepter les appels vers rm et diriger les fichiers supprimés vers la corbeille à la place

10

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

dzhelil
la source
Dans quelle mesure demandez-vous? Voulez-vous dire pour chaque appel rm par chaque utilisateur ou processus? Ou juste pour vous pendant que vous utilisez bash? Ou ..
djeikyb

Réponses:

13

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

sudo apt-get install trash-cli

Cela installera trash, empty-trash, list-trashet les restore-trashcommandes, que vous pouvez utiliser en l' état ou font rmun alias de trash(voir ci - dessous).

La sémantique de la trashcommande est un peu différente de la norme rm- elle n'a pas besoin d' -rindicateur 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 versions ultérieures, la dernière commande du script devrait être à la trash-put "${cmd[@]}"place de trash "${cmd[@]}"(car la commande est passée de trashà trash-put).

Rendez ensuite 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, qui fera bash pour appeler votre script au lieu de la rmcommande réelle :

alias rm="trash-rm"

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

Et ça devrait être ça.

Sergey
la source
C'est une bonne réponse, mais ce serait encore mieux si vous la réorganisiez pour souligner le concept principal de l'utilisation d'un alias. Je pense qu'il est très important de comprendre comment "intercepter" rm. Ce qui se passe à sa place peut être personnalisé de différentes manières.
djeikyb
En outre, il serait bon de mentionner que cela n'affecte que la commande rm pour la session bash de l'utilisateur.
djeikyb
@djeikyb: merci pour les suggestions, j'ai mis à jour la réponse
Sergey
Cela fonctionne très bien pour moi sans le script (juste installé et ajouté alias="trash"). Savez-vous quel est l'avantage d'avoir le script?
desgua
@desgua: le but du script est de faire trashen sorte de se comporter davantage rmen ce qui concerne la suppression de répertoires. Cela peut être important pour certains scripts qui s'attendent rmà fonctionner comme cela, par exemple. J'ai mis à jour la réponse.
Sergey
0

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

Florian Diesch
la source