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

10

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

Джелил
источник
Насколько универсален ты спрашиваешь? Вы имеете в виду для каждого звонка по каждому пользователю или процессу? Или только для вас, пока вы используете bash? Или ..
djikyb

Ответы:

13

Для этого на 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.

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

Сергей
источник
Это хороший ответ, но было бы еще лучше, если бы вы реорганизовали его, чтобы подчеркнуть основную концепцию использования псевдонима. Я думаю, что наиболее важно понять, как «перехватить» rm. То, что происходит на его месте, можно настроить любым количеством способов.
djeikyb
Также было бы полезно упомянуть, что это влияет только на команду rm для пользовательского сеанса bash.
djeikyb
@djeikyb: спасибо за предложения, я обновил ответ
Сергей
У меня отлично работает без скрипта (только что установил и добавил alias="trash"). Знаете ли вы, в чем преимущество сценария?
Desgua
@desgua: цель скрипта - заставить trashсебя вести себя как rmв отношении удаления каталогов. Это может быть важно для некоторых сценариев, которые, например, ожидают, что rmбудут работать так, как работают. Я обновил ответ.
Сергей
0

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

Флориан Диш
источник