Interceptando chamadas para rm e direcionando arquivos excluídos para a lixeira

10

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

dzhelil
fonte
Quão universal você está perguntando? Você quer dizer para cada chamada rm de cada usuário ou processo? Ou apenas para você enquanto estiver usando o bash? Ou ..
djeikyb 1/11/11

Respostas:

13

Há uma receita no webupd8.org para isso. Para evitar a podridão do link, aqui estão as informações importantes (com algumas adições).

sudo apt-get install trash-cli

Isto irá instalar trash, empty-trash, list-trashe restore-trashcomandos, que você pode usar como está ou fazer rmum apelido para trash(veja abaixo).

A semântica do trashcomando é um pouco diferente do padrão rm- não requer -rsinalizador para poder excluir diretórios. Se isso lhe incomoda, o webupd8.org propõe o seguinte script, que você pode colocar no seu PATH e chamá-lo 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 em trash-put "${cmd[@]}"vez de trash "${cmd[@]}"(como o comando mudou de trashpara trash-put).

Em seguida, torne o script executável:

chmod +x trash-rm

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

alias rm="trash-rm"

Como o djeikyb aponta corretamente, o truque de alias .bashrc funcionaria apenas para o usuário cujo .bashrc foi modificado e apenas na sessão do terminal bash.

E deve ser isso.

Sergey
fonte
Essa é uma boa resposta, mas seria ainda melhor se você a reorganizasse para enfatizar o conceito principal de usar um alias. Eu acho que é mais importante entender como "interceptar" rm. O que acontece em seu lugar pode ser personalizado de várias maneiras.
djeikyb
Além disso, seria bom mencionar que isso afeta apenas o comando rm da sessão bash do usuário.
#
@djeikyb: obrigado pelas sugestões, eu atualizei a resposta
Sergey
Funciona muito bem para mim sem o script (basta instalar e adicionar alias="trash"). Você sabe qual é a vantagem de ter o script?
Des
@desgua: o objetivo do script é fazer trashcom que ele se comporte mais rmem relação à exclusão de diretórios. Isso pode ser importante para alguns scripts que esperam rmfuncionar da maneira que funcionam, por exemplo. Eu atualizei a resposta.
Sergey
0

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

Florian Diesch
fonte