Rm को कॉल को इंटरसेप्ट करना, और डिलीट की गई फाइलों को ट्रेश करने के लिए निर्देशित करना


10

क्या rm को कॉल इंटरसेप्ट करने का कोई तरीका है, और इसके बजाय फाइलों को डिलीट करने के बजाय उन्हें रद्दी में स्थानांतरित करना है?


आप कितना सार्वभौमिक पूछ रहे हैं? क्या आपके पास प्रत्येक उपयोगकर्ता या प्रक्रिया द्वारा प्रत्येक आरएम कॉल का मतलब है? या बस के लिए आप का उपयोग करते समय आप मार रहे हैं? या ..
djeikyb

जवाबों:


13

इसके लिए webupd8.org पर एक नुस्खा है । लिंक रोट को रोकने के लिए, यहाँ महत्वपूर्ण जानकारी (कुछ अतिरिक्त के साथ) है।

sudo apt-get install trash-cli

यह स्थापित हो जाएगा trash, empty-trash, list-trashऔर restore-trashआज्ञाओं, जो आप उपयोग कर सकते हैं के रूप में है या बनाने rmके उपनाम trash(नीचे देखें)।

trashकमांड का सिमेंटिक थोड़ा अलग है, फिर मानक rm- यह -rनिर्देशिकाओं को हटाने में सक्षम होने के लिए ध्वज की आवश्यकता नहीं है । यदि यह आपको परेशान करता है, webupd8.org निम्नलिखित स्क्रिप्ट का प्रस्ताव करता है, जिसे आप अपने पैट में डाल सकते हैं और इसे कॉल कर सकते हैं 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[@]}"

उबंटू 12.04 और बाद में, स्क्रिप्ट में अंतिम कमांड के trash-put "${cmd[@]}"बजाय होना चाहिए trash "${cmd[@]}"(जैसा कि कमांड से बदल गया trashहै trash-put)।

फिर स्क्रिप्ट को निष्पादन योग्य बनाएं:

chmod +x trash-rm

एक बार जब आपके पास यह किसी निर्देशिका में होता है PATH, तो अपने ~ / .bashrc में एक उपनाम जोड़ें, जो वास्तविक rmकमांड के बजाय आपकी स्क्रिप्ट को लागू करने के लिए बैश करेगा :

alias rm="trash-rm"

जैसा कि djeikyb सही ढंग से इंगित करता है, .bashrc उर्फ ​​ट्रिक केवल उस उपयोगकर्ता के लिए काम करेगा, जिसका .bashrc संशोधित है, और केवल bash टर्मिनल सत्र में।

और यही होना चाहिए।


यह एक अच्छा जवाब है, लेकिन यह और भी बेहतर होगा यदि आप इसे एक उपनाम का उपयोग करने की मुख्य अवधारणा पर जोर देने के लिए इसे पुनर्गठित करें। मुझे लगता है कि यह समझना सबसे महत्वपूर्ण है कि "अवरोधन" आरएम कैसे करें। इसके स्थान पर क्या होता है इसे किसी भी तरीके से अनुकूलित किया जा सकता है।
djeikyb

इसके अलावा, यह उल्लेख करना अच्छा होगा कि यह केवल उपयोगकर्ता के बैश सत्र के लिए rm कमांड को प्रभावित करता है।
djeikyb

@djeikyb: शुगर के लिए धन्यवाद, मैंने जवाब अपडेट किया
सर्गेई

यह स्क्रिप्ट के बिना मेरे लिए बहुत अच्छा काम करता है (बस स्थापित और जोड़ें alias="trash")। क्या आपको पता है कि स्क्रिप्ट होने का क्या फायदा है?
देसुआ

@desgua: स्क्रिप्ट का उद्देश्य निर्देशिकाओं को हटाने के संबंध में trashअधिक व्यवहार करना है rm। यह कुछ लिपियों के लिए महत्वपूर्ण हो सकता है, जो rmइस तरह से काम करने की उम्मीद करते हैं, उदाहरण के लिए। मैंने जवाब अपडेट किया।
सर्जेई

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.