Interceptar llamadas a rm y dirigir archivos eliminados a la papelera


10

¿Hay alguna forma de interceptar llamadas a rm y, en lugar de eliminar permanentemente los archivos, moverlos a la papelera?


¿Qué tan universal estás preguntando? ¿Te refieres a cada llamada rm de cada usuario o proceso? ¿O solo para ti mientras estás usando bash? O ..
djeikyb 01 de

Respuestas:


13

Hay una receta en webupd8.org para esto. Para evitar la descomposición del enlace, aquí está la información importante (con algunas adiciones).

sudo apt-get install trash-cli

Esto instalará trash, empty-trash, list-trashy restore-trashcomandos, que puede utilizarse como está o hacen rmun alias de trash(ver más abajo).

La semántica del trashcomando es un poco diferente al estándar rm: no requiere -rmarca para poder eliminar directorios. Si esto le molesta, webupd8.org propone el siguiente script, que puede poner en su RUTA y llamarlo 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[@]}"

En Ubuntu 12.04 y versiones posteriores, el último comando en el script debe ser en trash-put "${cmd[@]}"lugar de trash "${cmd[@]}"(ya que el comando ha cambiado de trasha trash-put).

Luego haga que el script sea ejecutable:

chmod +x trash-rm

Una vez que lo tenga en algún directorio en su PATH, agregue un alias a su ~ / .bashrc, lo que hará que bash invoque su script en lugar del rmcomando real :

alias rm="trash-rm"

Como djeikyb señala correctamente, el truco de alias .bashrc solo funcionaría para el usuario cuyo .bashrc se modifica, y solo en la sesión de terminal bash.

Y eso debería ser todo.


Esta es una buena respuesta, pero sería aún mejor si la reorganizara para enfatizar el concepto principal de usar un alias. Creo que es muy importante entender cómo "interceptar" la empresa. Lo que sucede en su lugar se puede personalizar de muchas maneras.
djeikyb 01 de

Además, sería bueno mencionar que esto solo afecta el comando rm para la sesión bash del usuario.
djeikyb 01 de

@djeikyb: gracias por las sugerencias, actualicé la respuesta
Sergey

Funciona muy bien para mí sin el script (recién instalado y agregado alias="trash"). ¿Sabes cuál es la ventaja de tener el script?
Desgua

@desgua: el propósito del script es hacer trashque se comporte más como rmen lo que respecta a la eliminación de directorios. Esto puede ser importante para algunos scripts que esperan rmfuncionar de la manera en que lo hacen, por ejemplo. Actualicé la respuesta.
Sergey

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.