Interceptando chamadas para rm e direcionando arquivos excluídos para o lixo

10

Existe uma maneira de interceptar chamadas para o rm e, em vez de excluir permanentemente os arquivos, movê-los para a lixeira?

    
por dzhelil 01.11.2011 / 02:18

2 respostas

13

Há uma receita no webupd8. org para isso. Para evitar a perda de links, aqui está a informação importante (com alguns acréscimos).

sudo apt-get install trash-cli

Isso instalará os comandos trash , empty-trash , list-trash e restore-trash , que você pode usar como está ou tornar rm um alias de trash (veja abaixo).

A semântica do comando trash é um pouco diferente do padrão rm - ele não exige -r flag para poder excluir diretórios. Se isso incomodar você, o webupd8.org propõe o seguinte script, que você pode colocar em seu PATH e chamá-lo de 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[@]}"

No Ubuntu 12.04 e posterior, o último comando no script deve ser trash-put "${cmd[@]}" em vez de trash "${cmd[@]}" (conforme o comando foi alterado de trash para trash-put ).

Em seguida, torne o script executável:

chmod +x trash-rm

Depois de tê-lo em algum diretório em seu PATH , adicione um alias ao seu ~ / .bashrc, que fará o bash invocar seu script em vez do comando rm real:

alias rm="trash-rm"

Como djeikyb corretamente aponta, o truque de alias .bashrc só funciona para o usuário cujo .bashrc é modificado, e somente na sessão de terminal bash.

E deveria ser isso.

    
por Sergey 01.11.2011 / 02:42
0

libtrash (pacote libtrash no Ubuntu) parece fazer isso, mas eu nunca usado.

    
por Florian Diesch 01.11.2011 / 02:44

Tags