आरएम कमांड को उर्फ ​​करने और इसे सुरक्षित बनाने के लिए सर्वोत्तम अभ्यास


21

कुछ समय पहले मैंने गलती से अपना होम फोल्डर डिलीट कर दिया था, क्योंकि मैं rm -rf *गलत टर्मिनल पर था, जिसकी वर्किंग डायरेक्टरी होम फोल्डर थी!

काश मेरे पास rmकमांड के लिए एक उपनाम होता , लेकिन यह ऐसा नहीं था।

अब, मैं एक स्क्रिप्ट के लिए एक उपनाम के रूप में बनाने की योजना बना रहा हूं rm

क्या आपके पास सुझाव देने के लिए कोई सर्वोत्तम अभ्यास है?

धन्यवाद।


7
ऐसा नहीं है कि मेरे पास सहानुभूति नहीं है, लेकिन मुझे नहीं लगता कि rmसुरक्षा के लिए एक उपनाम की आवश्यकता एक खतरनाक आदेश है। rऔर fविकल्पों का उपयोग करके , आप बता रहे हैं कि मुझे पता है कि यह खतरनाक है, और मैंने इसके बारे में सावधानी से सोचा है, और यह _really_ है कि मैं क्या करना चाहता हूं । यदि आप उन विकल्पों का उपयोग नहीं करते हैं, तो आप इसके साथ अपने पूरे होम फोल्डर को नहीं हटा सकते हैं।
user26512

क्या यह प्रश्न समान जानकारी को stackoverflow.com/questions/373156/… के रूप में कवर करता है ?
डेविड हैरिस

1
@grossvogel कोई अपराध नहीं लिया :)! हालाँकि, इस आदेश का पालन करना एक आम बात है। प्रत्येक विलोपन की पुष्टि करने से बचने के लिए बहुत से लोग -f विकल्प का उपयोग करते हैं।

23
ध्यान दें कि यदि आप एक उपनाम का उपयोग करते हैं तो आपको rmउस उपनाम का उपयोग करने की सुविधा मिलेगी। फिर एक दिन, आप उस सिस्टम पर होंगे जहां उपनाम मौजूद नहीं है, और जब आप कम से कम इसकी उम्मीद कर रहे हैं तो आप गलत काम करेंगे। और यह शायद आपका सिस्टम नहीं होगा।
स्टीफन लासिवस्की

2
@puller केवल आरएचईएल जैसे सिस्टम पर जो मूर्खता से उर्फ rmहै rm -i
डैनियल बेक

जवाबों:


30

यदि आप एक स्वनिर्धारित चाहते हैं rm, तो इसे कॉल न करें rmलेकिन आपका नाम myrm, deleteया जो भी हो।

rm='rm -i'उर्फ एक हॉरर है, क्योंकि कुछ समय बाद इसे का उपयोग, जैसा कि आप उम्मीद करेंगे rmफ़ाइलों को हटाने से पहले डिफ़ॉल्ट रूप से संकेत देने के लिए। बेशक, एक दिन आप इसे एक ऐसे खाते के साथ चलाएंगे जो अलियास सेट नहीं है और इससे पहले कि आप समझें कि क्या चल रहा है, बहुत देर हो चुकी है।

किसी भी मामले में, फ़ाइल हानि या भ्रष्टाचार के लिए तैयार होने का एक अच्छा तरीका बैकअप है।

एक तेज़ विकल्प जो आपको आकस्मिक फ़ाइल विलोपन से बचाएगा या ओवरराइटिंग एक फ़ाइल सिस्टम का उपयोग कर रहा है जो ZFS जैसे असीमित स्नैपशॉट का समर्थन करता है। यदि लगातार स्नैपशॉट स्वचालित रूप से किए जाते हैं, तो आप उस स्थिति में फ़ाइलों को पुनर्प्राप्त कर सकते हैं जो वे घटना से पहले अंतिम स्नैपशॉट के दौरान थे।  


3
मैंने उस डरावनी कहानी को उन लोगों में से एक से व्यक्तिगत रूप से सुना है।
दान डी।

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

दरअसल, यही कारण है कि मैं पहली बार बैकअप करने का सुझाव देता हूं, जिसमें कोई फाइल सिस्टम निषिद्ध नहीं है।
जूलियरे

12

आप उपनाम बचाने चाहते हैं, लेकिन ऐसा करते हैं तो अक्षम करने के लिए दूसरों की तुलना में आपके सिस्टम पर अलग ढंग से काम कर रहा आदेशों के लिए इस्तेमाल किया जा रहा जोखिम नहीं करना चाहता, आप कर सकते हैं rmइस तरह

alias rm='echo "rm is disabled, use remove or trash or /bin/rm instead."'

फिर आप अपना खुद का सुरक्षित उपनाम बना सकते हैं, जैसे

alias remove='/bin/rm -irv'

या trashइसके बजाय का उपयोग करें ।


2
ध्यान दें कि (कम से कम कुछ संस्करणों में) आपको अन्य क्रम में उपनामों को परिभाषित करना होगा। इसे आप जिस क्रम में प्रस्तुत करते हैं उसे करते हुए परिभाषित removeकरते हैं echo "rm is disabled, use trash or /bin/rm instead." -irv। और, सामान्य ज्ञान की बात के रूप में, क्या आप संदेश rmको अपने सुरक्षित removeकमांड से संदर्भित नहीं करना चाहेंगे ?
स्कॉट

आप सही हैं, मैं तदनुसार उत्तर अपडेट करूंगा।
डारियो सेडल

5

आप trashइसके बजाय प्रयोग करके देख सकते हैं । बस इसे एक बार में खाली करने के लिए याद रखें ...


3

हर प्रोफाइल को बदलने के बिना, आप क्या कर सकते हैं, निर्देशिका में फ़ाइल -i कहा जाता है।

# touch -- -i
# ll
total 0
-rw-r--r-- 1 root users  0 Jan 26 19:24 files
drwxr-xr-x 2 root users 40 Jan 26 19:24 folder_of_power
-rw-r--r-- 1 root root   0 Jan 26 19:25 -i
-rw-r--r-- 1 root users  0 Jan 26 19:24 important
-rw-r--r-- 1 root users  0 Jan 26 19:24 very
# rm -rf *
rm: remove regular empty file `files'? 

यदि उपयोगकर्ता * का उपयोग करने का निर्णय लेता है तो काम नहीं करेगा। * के बजाय *। लेकिन फिर भी एक साफ सुथरी चाल।
चपरासी

1
afaik rm -rf न ही rm -rf .. सफल नहीं हो सकता क्योंकि आप इस समय निर्देशिका में हैं।
चपरासी

@Peon: मेरा मानना ​​है कि आप का मतलब है .* *, * .*(जो मैं मानता हूं कि अधिक आम है) या * . *(जो आपने कहा था)। …………………………………………………… इस तकनीक को सही मायने में, विश्व स्तर पर प्रभावी बनाने के लिए, आपको इसे हर उस निर्देशिका में करने की आवश्यकता होगी, जहाँ आपको लिखने की अनुमति है । लेकिन मैं सहमत हूं, यह एक साफ चाल है।
स्कॉट

1

मैं निम्नलिखित स्क्रिप्ट का उपयोग करता हूं।

#!/bin/sh

trash=$HOME/tmp
mv "$@" $trash
nohup find "$trash" -type f -atime +7 -exec /bin/rm '{}' \; 2>&1 &

यदि आप गलती से किसी फ़ाइल को हटा देते हैं, तो उसे फ़ाइल से पुनर्प्राप्त करें $HOME/tmp

स्क्रिप्ट हटाई गई फ़ाइलों को एक tmpडायरेक्टरी में ले जाती है और अगली बार डिलीट स्क्रिप्ट को डिलीट कर देती है यदि एक्सेस टाइम 7 दिन बाद ( $HOME/tmpडायरेक्टरी का सेमी-ऑटोमेटेड क्लीनअप ) है।


-2

आपके प्रोफाइल में,

alias rm="rm -i"

3
अलियासिंग आरएम, मेरी राय में, काफी खराब सलाह है और यह किसी भी तरह से पुलर के मामले में मदद नहीं करेगा।
जॉलीग्रे

rm -Iदोनों दुनिया का सबसे अच्छा देता है, @jlliagre।
तमारा विजसमैन

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

@jlliagre: हम्म, तो आपका मतलब है कि स्क्रिप्ट इस बदलाव को पकड़ती हैं?
तमारा विजसमैन

मेरी बात जानने के लिए कृपया मेरा उत्तर superuser.com/a/382498/19279 पढ़ें ।
जूलियरे

-2

एक स्क्रिप्ट d, सामग्री के साथ mv $* /tmp

संपादित करें: यह एक बुरा विचार है; निचे देखो। मेरे पास वर्तमान alias d='mv -t /tmp'में मेरे .profileबजाय है।


2
यह सुझाव खतरनाक है और एक) पहले से ट्रैश की गई फ़ाइलों को एक ही नाम या b के साथ ओवरराइड कर सकता है) पूरी तरह से गलत फ़ाइलों d "foo bar"को हटा दें (फ़ाइलों को हटा देगा fooऔर bar)। कुछ सुरक्षित है #!/bin/bash TRASH="$( mktemp -d -t trashed.XXX )"; echo "Moving to trash $TRASH"; mv -v -- "$@" "$TRASH"( mktempऔर mvसिंटैक्स आपके सिस्टम पर निर्भर करता है, यह एक लिनक्स के लिए काम करता है)।
डैनियल बेक

2
स्पष्टीकरण के लिए धन्यवाद। मैं मुद्दे के साथ ठीक हूँ a) लेकिन मुद्दा b) एक बड़ी समस्या है। मैंने अपनी dआज्ञा को अपने में बदल alias d='mv -t /tmp'लिया .profile; मुझे लगता है कि वह सरल उपाय है जिसकी मुझे तलाश थी।
बीफस

-2

यह बैश कोड rmआपके ~/.bash_profileकॉन्फ़िगरेशन फ़ाइल में फ़ंक्शन जोड़ता है । इसे चलाने के बाद, यदि आप लिखते हैं, तो आप rm fileउस फ़ाइल को स्थानांतरित कर देंगे/tmp

cat << EOF >> ~/.bash_profile
rm () {
  mv $1 /tmp
}
EOF

1
यह स्क्रिप्ट / कोड क्या करता है? कृपया समझाएं ताकि कम-तकनीकी उपयोगकर्ता आपके उत्तर को समझ सकें।
वायलिक्स

2
हालांकि यह प्रश्न का उत्तर दे सकता है, यह एक बेहतर उत्तर होगा यदि आप कुछ स्पष्टीकरण प्रदान कर सकते हैं कि ऐसा क्यों होता है।
DavidPostill

1
यह प्रश्न का उत्तर प्रदान करता है, लेकिन यह बहुत खराब है। इस उत्तर के दो बेहतर संस्करण पहले ही पोस्ट किए जा चुके हैं।
स्कॉट

यह बैश कोड rmआपके ~/.bash_profileकॉन्फ़िगरेशन फ़ाइल में फ़ंक्शन जोड़ता है । इस फ़ाइल को चलाने के बाद, यदि आप लिखते हैं, तो आप rm fileउस फ़ाइल को स्थानांतरित कर देंगे /tmp
विसेंट गोंजालेज

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