Thay vào đó, chặn các cuộc gọi đến rm và chuyển các tệp đã xóa vào thùng rác


10

Có cách nào để chặn các cuộc gọi đến rm, và thay vì xóa vĩnh viễn các tập tin, thay vào đó hãy chuyển chúng vào thùng rác?


Làm thế nào phổ quát bạn đang hỏi? Bạn có nghĩa là cho mỗi cuộc gọi rm của mỗi người dùng hoặc quá trình? Hoặc chỉ cho bạn trong khi bạn đang sử dụng bash? Hoặc ..
djeikyb

Câu trả lời:


13

Có một công thức trên webupd8.org cho việc này. Để ngăn ngừa thối liên kết, đây là thông tin quan trọng (có thêm một vài bổ sung).

sudo apt-get install trash-cli

Điều này sẽ cài đặt trash, empty-trash, list-trashrestore-trashcác lệnh mà bạn có thể sử dụng như hiện trạng không hoặc làm rmbí danh của trash(xem dưới đây).

Ngữ nghĩa của trashlệnh khác một chút so với tiêu chuẩn rm- nó không yêu cầu -rcờ để có thể xóa các thư mục. Nếu điều này làm phiền bạn, webupd8.org đề xuất tập lệnh sau, bạn có thể đặt PATH của mình và gọi nó 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[@]}"

Trong Ubuntu 12.04 trở lên, lệnh cuối cùng trong tập lệnh nên được trash-put "${cmd[@]}"thay thế trash "${cmd[@]}"(vì lệnh đã thay đổi từ trashthành trash-put).

Sau đó làm cho tập lệnh thực thi:

chmod +x trash-rm

Khi bạn đã có nó trong một số thư mục trong thư mục của mình PATH, hãy thêm bí danh vào ~ / .bashrc, điều này sẽ tạo bash để gọi tập lệnh của bạn thay vì rmlệnh thực tế :

alias rm="trash-rm"

Như djeikyb chỉ ra một cách chính xác, thủ thuật bí danh .bashrc sẽ chỉ hoạt động đối với người dùng có .bashrc được sửa đổi và chỉ trong phiên bash terminal.

Và đó nên là nó.


Đây là một câu trả lời tốt, nhưng sẽ tốt hơn nữa nếu bạn sắp xếp lại nó để nhấn mạnh khái niệm chính về việc sử dụng bí danh. Tôi nghĩ điều quan trọng nhất là phải hiểu cách "chặn" rm. Những gì xảy ra ở vị trí của nó có thể được tùy chỉnh bất kỳ số cách.
djeikyb

Ngoài ra, thật tốt khi đề cập rằng điều này chỉ ảnh hưởng đến lệnh rm cho phiên bash của người dùng.
djeikyb

@djeikyb: cảm ơn cho suggesions, tôi cập nhật câu trả lời
Sergey

Nó hoạt động tuyệt vời cho tôi mà không cần kịch bản (chỉ cần cài đặt và thêm alias="trash"). Bạn có biết lợi thế của việc có kịch bản là gì không?
desgua

@desgua: mục đích của tập lệnh là thực hiện trashđể hành xử giống như rmliên quan đến việc xóa các thư mục. Điều này có thể quan trọng đối với một số tập lệnh dự kiến rmsẽ hoạt động theo cách nó, ví dụ. Tôi cập nhật câu trả lời.
Serge

0

libtrash (gói libtrash trong Ubuntu) dường như làm điều này, nhưng tôi chưa bao giờ sử dụng nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.