Перехоплення дзвінків у rm та спрямування видалених файлів замість сміття


10

Чи є спосіб перехопити виклики в rm і замість того, щоб постійно видаляти файли, переміщувати їх у смітник?


Наскільки універсальний ви запитуєте? Ви маєте на увазі для кожного дзвінка rm кожен користувач чи процес? Або просто для вас, коли ви використовуєте bash? Або ..
djeikyb

Відповіді:


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.