拦截对 rm 的调用,并将已删除的文件定向到垃圾箱

D R*_*D R 10 delete trash

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

Ser*_*gey 13

webupd8.org 上有一个食谱。为防止链接失效,以下是重要信息(添加一些内容)。

sudo apt-get install trash-cli
Run Code Online (Sandbox Code Playgroud)

这将安装trashempty-trashlist-trashrestore-trash命令,您可以按原样使用或制作rm的别名trash(见下文)。

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[@]}"
Run Code Online (Sandbox Code Playgroud)

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

然后使脚本可执行:

chmod +x trash-rm
Run Code Online (Sandbox Code Playgroud)

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

alias rm="trash-rm"
Run Code Online (Sandbox Code Playgroud)

正如 djeikyb 正确指出的那样, .bashrc 别名技巧仅适用于 .bashrc 被修改的用户,并且仅适用于 bash 终端会话。

应该就是这样。