Перехват вызовов rm и направление удаленных файлов в корзину

Перехват вызовов rm и направление удаленных файлов в корзину

Есть ли способ перехватывать вызовы rm и вместо окончательного удаления файлов перемещать их в корзину?

решение1

Естьрецепт на webupd8.orgдля этого. Чтобы предотвратить порчу ссылок, вот важная информация (с несколькими дополнениями).

sudo apt-get install trash-cli

Это установит команды trash, empty-trash, list-trashи restore-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[@]}"(так как команда изменилась с trashна trash-put).

Затем сделайте скрипт исполняемым:

chmod +x trash-rm

Как только он будет помещен в какой-либо каталог в вашем PATH, добавьте псевдоним в ваш ~/.bashrc, который заставит bash вызывать ваш скрипт вместо фактической rmкоманды:

alias rm="trash-rm"

Как правильно отмечает djeikyb, трюк с псевдонимом .bashrc будет работать только для пользователя, чей .bashrc изменен, и только в терминальном сеансе bash.

И это должно быть все.

решение2

libtrash(пакет libtrash в Ubuntu) похоже делает это, но я никогда им не пользовался.

Связанный контент