拦截对 rm 的调用,并将已删除的文件直接放入垃圾箱

拦截对 rm 的调用,并将已删除的文件直接放入垃圾箱

有没有办法拦截对 rm 的调用,而不是永久删除文件,而是将它们移至垃圾箱?

答案1

有一个webupd8.org 上的食谱为此。为了防止链接失效,以下是重要信息(附有少量补充)。

sudo apt-get install trash-cli

这将安装trashempty-trash和命令,您可以按原样使用它们或创建list-trash它们的别名(见下文)。restore-trashrmtrash

该命令的语义trash与标准略有不同rm- 它不需要-r标志即可删除目录。如果这让您感到困扰,webupd8.org 提出了以下脚本,您可以将其放入 PATH 中并调用它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[@]}"

在 Ubuntu 12.04 及更高版本中,脚本中的最后一条命令应该用trash-put "${cmd[@]}"代替trash "${cmd[@]}"(因为命令已从 更改trashtrash-put)。

然后使脚本可执行:

chmod +x trash-rm

将它放在你的某个目录中后PATH,为你的 ~/.bashrc 添加一个别名,这将使 bash 调用你的脚本而不是实际的rm命令:

alias rm="trash-rm"

正如 djeikyb 正确指出的那样,.bashrc 别名技巧只对 .bashrc 被修改的用户有效,并且仅在 bash 终端会话中有效。

就这样吧。

答案2

自由垃圾(Ubuntu 中的 libtrash 包)似乎可以做到这一点,但我从未使用过它。

相关内容