Mencegat panggilan ke rm, dan mengarahkan file yang dihapus ke sampah sebagai gantinya

10

Apakah ada cara untuk mencegat panggilan ke rm, dan alih-alih menghapus file secara permanen, memindahkannya ke sampah saja?

dzhelil
sumber
Seberapa universal Anda bertanya? Apakah maksud Anda untuk setiap panggilan rm oleh setiap pengguna atau proses? Atau hanya untuk Anda saat Anda menggunakan bash? Atau ..
djeikyb

Jawaban:

13

Ada resep di webupd8.org untuk ini. Untuk mencegah pembusukan tautan, inilah informasi penting (dengan beberapa tambahan).

sudo apt-get install trash-cli

Ini akan menginstal trash, empty-trash, list-trashdan restore-trashperintah, yang dapat Anda gunakan sebagai-adalah atau membuat rmalias dari trash(lihat di bawah).

Semantik dari trashperintah ini sedikit berbeda dari standar rm- itu tidak memerlukan -rflag untuk dapat menghapus direktori. Jika ini mengganggu Anda, webupd8.org mengusulkan skrip berikut, yang dapat Anda masukkan ke dalam PATH Anda dan menyebutnya 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[@]}"

Di Ubuntu 12.04 dan yang lebih baru, perintah terakhir dalam skrip seharusnya trash-put "${cmd[@]}"bukan trash "${cmd[@]}"(karena perintah telah berubah dari trashmenjadi trash-put).

Kemudian buat skrip tersebut dapat dieksekusi:

chmod +x trash-rm

Setelah Anda memilikinya di beberapa direktori di Anda PATH, tambahkan alias ke ~ / .bashrc Anda, yang akan membuat bash untuk memanggil skrip Anda alih-alih rmperintah yang sebenarnya :

alias rm="trash-rm"

Seperti yang ditunjukkan djeikyb dengan benar, trik .bashrc alias hanya akan berfungsi untuk pengguna yang .bashrc dimodifikasi, dan hanya dalam sesi terminal bash.

Dan seharusnya begitu.

Sergey
sumber
Ini adalah jawaban yang bagus, tetapi akan lebih baik jika Anda mengaturnya kembali untuk menekankan konsep utama menggunakan alias. Saya pikir paling penting untuk memahami bagaimana "mencegat" rm. Apa yang terjadi di tempatnya dapat disesuaikan dengan berbagai cara.
djeikyb
Juga, akan baik untuk menyebutkan bahwa ini hanya memengaruhi perintah rm untuk sesi bash pengguna.
djeikyb
@djeikyb: terima kasih untuk sarannya, saya memperbarui jawabannya
Sergey
Ini berfungsi baik bagi saya tanpa skrip (baru diinstal dan tambahkan alias="trash"). Tahukah Anda apa keuntungan memiliki skrip?
desgua
@desgua: tujuan dari skrip ini adalah trashuntuk berperilaku lebih seperti rmdalam menghapus direktori. Ini mungkin penting untuk beberapa skrip yang berharap rmberfungsi seperti itu, misalnya. Saya memperbarui jawabannya.
Sergey
0

libtrash (package libtrash di Ubuntu) tampaknya melakukan ini, tetapi saya belum pernah menggunakannya.

Florian Diesch
sumber