Перехват вызовов в 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будут работать так, как работают. Я обновил ответ.
— Сергей

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.