Intercepting calls to rm, and directing deleted files to trash instead

There's a recipe on webupd8.org for this. To prevent link rot, here's the important information (with a few additions).

sudo apt-get install trash-cli

This will install trash, empty-trash, list-trash and restore-trash commands, which you can use as-is or make rm an alias of trash (see below).

The semantic of the trash command is a bit different then the standard rm - it doesn't require -r flag in order to be able to delete directories. If this bothers you, webupd8.org proposes the following script, which you can put in your PATH and call it 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[@]}"

In Ubuntu 12.04 and later, the last command in the script should be trash-put "${cmd[@]}" instead of trash "${cmd[@]}" (as the command has changed from trash to trash-put).

Then make the script executable:

chmod +x trash-rm

Once you have it in some directory in your PATH, add an alias to your ~/.bashrc, which will make bash to invoke your script instead of the actual rm command:

alias rm="trash-rm"

As djeikyb correctly points out, the .bashrc alias trick would only work for the user whose .bashrc is modified, and only in bash terminal session.

And that should be it.