web-dev-qa-db-ja.com

rmへの呼び出しをインターセプトし、代わりに削除されたファイルをゴミ箱に送る

Rmへの呼び出しを傍受し、ファイルを永久に削除する代わりに、それらをゴミ箱に移動する方法はありますか?

10
dzhelil

これには webupd8.orgのレシピ があります。リンクの腐敗を防ぐために、ここに重要な情報をいくつか追加します

Sudo apt-get install trash-cli

これにより、trashempty-trashlist-trash、およびrestore-trashコマンドがインストールされます。これらのコマンドは、そのまま使用するか、rmtrash(以下を参照)。

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ターミナルセッションでのみ機能します。

そしてそれはそれであるはずです。

13
Sergey

libtrash (Ubuntuのlibtrashパッケージ)はこれを行うようですが、私は使用したことがありません。

0
Florian Diesch