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


10

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


您问的普遍程度如何?您是说每个用户或进程的每个rm调用吗?还是只为您使用bash而已?或
djeikyb 2011年

Answers:


13

在webupd8.org上有一个关于此的食谱。为防止链接腐烂,这里是重要信息(有一些附加内容)。

sudo apt-get install trash-cli

这将安装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[@]}"

在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终端会话中有效。

就是这样。


这是一个很好的答案,但是如果您重新组织它以强调使用别名的主要概念,那就更好了。我认为了解如何“拦截” rm最重要。可以用多种方式自定义发生的事情。
djeikyb

同样,值得一提的是,这仅影响用户bash会话的rm命令。
djeikyb

@djeikyb:感谢您的建议,我更新了答案
Sergey

没有脚本(仅安装并添加alias="trash"),它对我来说非常有用。您知道使用脚本有什么好处吗?
desgua 2012年

@desgua:该脚本的目的是使trash行为更像rm删除目录。例如,这对于某些希望按其rm方式工作的脚本而言可能很重要。我更新了答案。
谢尔盖(Sergey)2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.