ग्लोबिंग का उपयोग करने पर क्या मैं `rm` को केवल इंटरएक्टिव बना सकता हूं? (या तो बाश या zsh या दोनों में)


15

जब भी मैं rmएक बार शेल ग्लोबिंग के साथ एक से अधिक आइटम करता हूं और यहां तक ​​कि थोड़ी सी भी संभावना है कि पैटर्न जितना मैं इसकी अपेक्षा करता हूं उससे अधिक फैलता है, मैं हमेशा जोड़ने की याद रखने की कोशिश करता हूं -i, लेकिन (निश्चित रूप से) मैं भूल सकता हूं और गलती से कुछ उपयोगी उड़ा सकता हूं। कुछ लोग इस समस्या को एक उपनाम के साथ हल करने की कोशिश करते हैं, जैसे कि alias rm='rm -i'लेकिन मैं rm को हमेशा इंटरैक्टिव बनाने के विचार से नफरत करता हूं , क्योंकि तब मैं -fहर समय उपयोग करने की आदत डालूंगा , जो स्पष्ट रूप से पूरे उद्देश्य को हरा देगा।

मैं जो करना चाहता हूं, rmकेवल तभी उपयोग -iकर सकता हूं जब मैं ग्लोबिंग का उपयोग करता हूं, और -fनिश्चित रूप से ओवरराइड करने के लिए -i, इसलिए मैं अभी भी पूरी निर्देशिका को सामान्य रूप से उड़ा सकता हूं rm -rf junk

इसलिए rm *blah*वास्तव में होगा rm -i *blah*लेकिन rm blahटाइप किए गए के समान ही काम करेगा।

यदि यह अलग-अलग गोले में पूरा किया जा सकता है, तो इस बात में अंतर है, मैं एक उत्तर चुनूंगा जो केवल एक या दूसरे को कवर करने वाले उत्तरों पर बाश और ज़ीश दोनों के लिए तरीकों की आपूर्ति करता है।


नोट : मैं वास्तव में आश्वस्त नहीं हूं कि यह जरूरी एक अच्छा विचार है; मैं सिर्फ यह पूछ रहा हूं कि क्या यह संभव है। यदि आपको लगता है कि यह एक मूर्खतापूर्ण विचार है, तो मुझे आपकी राय के पीछे तर्क सुनने में बहुत खुशी होगी, लेकिन कृपया उत्तर क्षेत्र में ऐसी टिप्पणियों को पोस्ट न करें । वास्तविक उत्तर या तो मुझे बताएं कि यह कैसे करना है या यह समझाना है कि / यह क्यों संभव नहीं है (या संभवतः एक समान परिणाम प्राप्त करने के लिए एक वैकल्पिक विधि प्रदान करता है)। लेकिन अगर आप मुझे यह बताना चाहते हैं कि यह गूंगा क्यों है, तो कृपया टिप्पणी के रूप में पोस्ट करें। यदि मैं निष्कर्ष से असहमत हूं, तो भी मैं अच्छी तरह से टिप्पणी करूंगा।


7
कुछ सुझाव: जीएनयू उपयोगिताओं के साथ, केवल उस rm -Iतरह से -iट्रिगर होता है जब तीन से अधिक फाइलें या -rपारित हो जाती हैं। में bash, Ctrl-x *ग्लोब का विस्तार करने और इसे स्वयं निरीक्षण करने के लिए कीबोर्ड शॉर्टकट का उपयोग करें।
jw013

2
बैश के साथ, मेरा मानना ​​है कि उत्तर "नहीं" है। Zsh के साथ, आप उदाहरण के लिए, rias को noglobaliasing noglob my-rmऔर फिर my-rm को एक स्क्रिप्ट के रूप में लाभ उठा सकते हैं , जो एक ग्लोब के लिए जाँच करता है, इसका विस्तार करता है, और पास -i करता है या नहीं। यकीन नहीं है, पता नहीं zsh।
derobert

@derobert: आप निश्चित रूप से लगता है जैसे आप बहुत अच्छी तरह से जानते हैं।
iconoclast

@iconoclast नहीं, नहीं zsh, बस Google। अजीब तरह से, मैंने पाया है कि जब यह खोजने की कोशिश कर रहा है कि इसे कैसे करें। :-P
derobert

यदि आप कुछ ऐसा चाहते हैं जो rm जैसा दिखता है, लेकिन वास्तव में अलग काम करता है, तो मुझे एक स्क्रिप्ट (या उपनाम / फ़ंक्शन / फ़ंक्शन कुंजी) को कॉल करना चाहिए myrmऔर उस स्क्रिप्ट को वह करना चाहिए जो आपको पसंद है।
वाल्टर ए

जवाबों:


9

यह आसान नहीं है। समस्या यह है कि जब आप करते हैं:

rm -- *.txt

आरएम केवल फाइलों की सूची देखता है, न कि गोलाकार पैटर्न जो पहले से ही शेल द्वारा विस्तारित किया गया है।

आप क्या कर सकते हैं (zsh):

alias rm='noglob rm'

यह zsh को बताता है कि rm कॉल करते समय पैटर्न का विस्तार नहीं किया जाना चाहिए। फिर आप rm को एक ऐसे फंक्शन के रूप में फिर से परिभाषित कर सकते हैं जो विस्तार को स्वयं करता है और "-i" को जोड़ता है यदि जरूरत कुछ इस तरह हो:

'rm'() {
  [[ "$*" = *[*[?]* ]] && set -- -i "$@"
  command rm $~@
}

हालांकि इस दृष्टिकोण के साथ समस्या यह है कि यह नया "आरएम" अंतर नहीं देखता है

rm *

तथा

rm '*'

नामक फ़ाइल को निकालने के लिए *, आपको इसे लिखना होगा:

rm [*]

-1

बाश में काम करता है, शायद अन्य गोले में। अपने में जगह.bashrc

function rm() { 
  while test "${1:0:1}" = "-"; do 
    shift
  done
  if test $# -eq 1; then 
    command rm "$1"
  else 
    command rm -i "$@"
  fi
}

3
आप command rmहार्ड-कोडिंग से बचने के लिए उपयोग कर सकते हैं PATH। इसके अलावा, तर्क संख्या की जांच का दृष्टिकोण थोड़ा अविश्वसनीय है, जैसा rmकि विकल्प ले सकते हैं।
jw013

1
"$ 1" को उद्धृत किया जाना चाहिए, या यह विफल हो जाएगा यदि एकल फ़ाइल में एक स्थान होता है। @ jw013 - आप भी कमांड से बच सकते हैं, जैसे\rm
जोर्डन

@jordanm आप $1दोहरे उद्धरण चिह्नों की आवश्यकता के बारे में सही हैं , लेकिन कमांड के भागने के बारे में गलत है। उद्धरण केवल उपनामों को दबाता है, लुक-अप कार्य नहीं करता है। यह जवाब एक फ़ंक्शन का सुझाव दे रहा है, न कि एक उपनाम।
jw013

1
कम से कम पुराना संपादन कार्यात्मक था - नया एडिट उपयोगकर्ता कमांड लाइन विकल्प को छोड़ देता है, जो कि शायद सही बात नहीं है।
jw013

@ jw013 - मुझे इस बात की जानकारी नहीं थी कि केवल उर्फ ​​लुक्स के लिए काम किया जाता है, कार्यों के लिए नहीं। सूचना के लिए धन्यवाद।
जोर्डन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.