क्या rm -rf * वर्तमान निर्देशिका की सभी फाइलों / फ़ोल्डरों को हटा देगा?


20

क्या rm -rf *वर्तमान निर्देशिका में सभी फ़ाइलें / फ़ोल्डर निकाल देंगे ? मैं यह सुनिश्चित करना चाहता हूं कि वाइल्डकार्ड *ऊपरी निर्देशिकाओं में नहीं जाएगा और मेरे सभी फाइल सिस्टम को मिटा देगा। : डी

मुझे छिपी हुई फाइलें chmod 777 .* -Rकरना याद है chmodऔर यह chmodमेरे सारे फाइलसिस्टम को एड करता है। जाहिर है, मैं रूट अकाउंट पर था।


1
यही कारण है कि मैं करूंगा rm -rf ./*और स्पष्ट रूप से वर्तमान निर्देशिका को निर्दिष्ट करूंगा ... लेकिन अंकुर को लगता है कि यह वैसे भी कोई मायने नहीं रखता है।
एमपीएन

@ मर्क: .. और ../ के बीच क्या अंतर है? आप सीडी ./ .. की कोशिश कर सकते हैं और देख सकते हैं कि आप कहाँ समाप्त होते हैं :)
जोहान

@ जोहान: कोई फर्क नहीं ... मुझे लगता है कि यह सिर्फ मेरे पागल सिर में अधिक समझ में आता है: डी
एमपीएन

@ मर्क: आसान गलती :)
जोहान

जवाबों:


15

नहीं, यदि आपने अपने शेल को बहुत अधिक ट्विस्ट नहीं किया है तो यह फाइल या डायरेक्ट्री को शुरू नहीं करेगा .। उन्हें निकालने के लिए, आप या तो उन्हें स्पष्ट रूप से सूचीबद्ध कर सकते हैं

rm -rf .file .dir

या सही ग्लोब पैटर्न का उपयोग करें (धन्यवाद क्रिस)

rm -rf .[^.]* ..?*

संपादित करें यहां बिंदु यह है कि आप .*फ़ाइलों का मिलान करने के लिए उपयोग नहीं कर सकते .file, क्योंकि .*या .*?मेल भी खाएंगे ..या ..[^.]*फ़ाइलों की तरह मेल खाता है .file, जबकि ..?*फ़ाइलों की तरह मेल खाता है ..foo( *शून्य या अधिक वर्णों से ?मेल खाता है, जबकि बिल्कुल एक से मेल खाता है)।


1
आपको ..?*प्रविष्टियों को पकड़ने के लिए भी कुछ चाहिए जो ".." (जैसे ..foo) से शुरू होते हैं।
क्रिस जॉन्सन

@ क्रिस: ठीक है, मैं इस picky पागलपन शुरू कर दिया, आप सही हैं?)
बेंजामिन बन्नियर

यह न केवल "सही" ग्लोब पैटर्न का उपयोग करना है, यह मिलान की गई वस्तुओं की मात्रा के बारे में भी है। फ़ाइलों की एक बड़ी मात्रा के साथ निर्देशिकाओं में शेल सबसे अधिक संभावना है कि एक मोड़ पर 50k फ़ाइलों को देने में सक्षम नहीं है rm। इसलिए, * के साथ एक निर्देशिका की सामग्री को हटाना सबसे बुद्धिमान तरीका नहीं है, इहो।
अकीरा

मुझे लगता है कि समझाना xargsइस सवाल के दायरे से थोड़ा परे है। एक उदाहरण के बारे में सोचना शुरू कर सकता है कि जब शेल तर्क सूची सूची की शिकायत करता है।
बेंजामिन बन्नियर

1
मुझे लगता है कि यह गुंजाइश से बाहर नहीं है क्योंकि मुझे लगता है कि ओपी को यकीन नहीं है कि उसकी अंतिम समस्या / समाधान कैसे प्राप्त किया जाए: निर्देशिका की सभी सामग्री को हटा दें। ओपी केवल सामान्य (गलत) काम कर रहा है पहले से ही एक समाधान (एक बुरा) को ध्यान में रखकर और पूछ रहा है कि यह समाधान समस्याओं का कारण क्यों बनता है। बेहतर तरीका यह होगा: "कैसे निर्देशिका को हटाने के बिना एक निर्देशिका में सभी फ़ाइलों को हटाने के लिए?" ओपी के समाधान के कारण समस्याओं का कारण होगा कि ग्लोबिंग कैसे काम करता है।
अकीरा

12

यदि आप किसी निर्देशिका और उसकी सभी सामग्रियों को हटाना चाहते हैं, तो आप chdirमूल निर्देशिका में और उन्हें rm -rfउस निर्देशिका को नाम दे सकते हैं, जो संपूर्ण ग्लोबिंग प्रश्न को दरकिनार करती है। यदि आप सामग्री को हटाना चाहते हैं, लेकिन निर्देशिका को रखना चाहते हैं, तो सभी को हटाना आसान है और फिर निर्देशिका को पुन: बनाएँ।

यह एक ग्लोब के साथ आने के लिए जटिल है जो सभी संभव निर्देशिका प्रविष्टियों से बचाएगा। तथा ..; एक सरल उत्तर (जैसे * .??*) के साथ आना आसान है जो लगभग हमेशा अभ्यास में काम करेगा। यह इंटरैक्टिव उपयोग के लिए ठीक है, क्योंकि यह याद रखना आसान है और यह काम नहीं करने वाले समय को पोस्ट-आरएम के साथ पकड़ा जा सकता है ls -a। एक स्क्रिप्ट के लिए, सभी को हटाने और खाली निर्देशिका को फिर से बनाना आसान है।


1
यही कारण है कि मैं के रूप में अच्छी तरह से सुझाव देना होगा: निर्देशिका और दूर फेंक
akira

यहां तक ​​कि आप इसका जवाब नहीं है यह एक अच्छा विचार है।
जोहान

10

चूंकि मुझे लगता है कि यह सवाल अधिक है कि क्या करता है (और आरएम नहीं), चलो एक और दृष्टिकोण की कोशिश करें।


यदि आप अनिश्चित हैं कि * क्या करता है, तो आप इको जैसी हानिरहित कमांड का उपयोग करके पहले "परीक्षण" कर सकते हैं। इससे पहले कि आप इसे चलाएं, यह अनुमान लगाने की कोशिश करें कि यदि आप उन्हें अपने घर के डायर में चलाते हैं तो वे क्या दिखाएंगे।

echo *
echo .*

लेकिन पहले हम एक खेल का मैदान बनाएं, ताकि हम सितारों के साथ खेल सकें और देख सकें कि हम क्या कर रहे हैं।

mkdir ~/star_test/
cd ~/star_test/
>.file1
>file2

अब इस dir में हमारे पास यह है:

cj@zap:~/star_test$ ls -1a
.
..
.file1
file2

अब ध्यान दें कि गूंज कमांड का उपयोग करने में क्या फैलता है:

cj@zap:~/star_test$ echo *
file2
cj@zap:~/star_test$ echo .*
. .. .file1

तो देखते हैं कि rm कमांड से क्या होता है

cj@zap:~/star_test$ rm -rf *
cj@zap:~/star_test$ ls -1a
.
..
.file1

जैसा कि आप देख रहे हैं कि उसने केवल फाइल 2 को ही हटाया है, क्योंकि * केवल फाइल 2 तक ही विस्तारित है। यदि आप rm -rf टाइप करेंगे। * जो लेखन के समान होगा

rm -rf . .. .file1

और सच कहूँ, तो मजा नहीं आता;)

आशा है कि यह आपके प्रश्न के * भाग को स्पष्ट करता है।


अद्यतन: हालांकि अंकुर गोयल बताते हैं कि आरएम में निर्मित किसी प्रकार का संरक्षण है (शेल कमांड के लिए असामान्य प्रकार :)

चलो एक नया खेल का मैदान बनाएँ:

cd ~/star_test/
mkdir -p test1/test2/test3
sudo chown root.root test1
cd test1/test2/test3/
>.file1
>file2

तो अब हमारे पास यह फिर से है, लेकिन टेस्ट 1 के पास रूट के रूप में स्वामित्व है यदि आरएमएस बर्शकार जाना शुरू कर देता है।

cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2  .file1
cj@zap:~/star_test/test1/test2/test3$ echo .*
. .. .file1

तो चलो सब कुछ हटा दें:

cj@zap:~/star_test/test1/test2/test3$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2

और ऐसा लग रहा है कि आरएम ने नहीं हटाया। और .. भले ही हमने उसे कहा था !!!

तो इस लंबे जवाब के बाद यह एक डायर के साथ सब कुछ हटाने के लिए सुरक्षित हो जाता है:

rm -rf * .*

लेकिन मैं देखभाल के साथ इसका उपयोग करूंगा, क्योंकि मुझे यकीन नहीं है कि आरएम के सभी कार्यान्वयन इस तरह से व्यवहार करते हैं!


7

हाँ। rm -rf केवल वर्तमान निर्देशिका में फ़ाइलों और फ़ोल्डरों को हटा देगा, और फ़ाइल ट्री के ऊपर नहीं चढ़ेगा। आरएम भी सीमलिंक का पालन नहीं करेगा और उन फाइलों को हटा देगा जो वे इंगित करते हैं, इसलिए आप गलती से अपने फाइल सिस्टम के अन्य हिस्सों को प्रिउन नहीं करते हैं।


1

यदि आप mpez0 कहा और rm -rfइस विशिष्ट फ़ोल्डर की तरह एक स्तर को ऊपर नहीं ले जाना चाहते हैं , तो सभी निर्देशिकाओं / फ़ाइलों को छोड़कर .और ..वर्तमान फ़ोल्डर में काम करने का एक तरीका है :

rm -rf $(ls -A)

बेशक, यदि किसी भी निर्देशिका / फाइल में शेल IFSस्पेशल वैरिएबल (जैसे स्पेस, टैब, न्यूलाइन) में से कोई एक अक्षर है , तो आप पहले IFS को बदलना चाहते हैं, कमांड को रन कर सकते हैं, फिर IFS को पुनर्स्थापित कर सकते हैं।


0

एक संपूर्ण फ़ोल्डर को खाली करने का एक बहुत आसान तरीका, इस उत्तर में चर्चा किए गए "बहुत सारे तर्क" मुद्दों से बचने के लिए , केवल निर्देशिका को हटाना और पुनः बनाना है। यह सुनिश्चित करने के लिए कि सहिष्णु निर्देशिका में होने पर यह सही ढंग से काम करता है, निम्नलिखित पंक्तियों का उपयोग करें:

cd ..
rm -rf $(readlink -f yourdir) #remove the directory, treat the case of a symlink
                        # by using readlink, to recreate the linked-to directory
mkdir $(readlink -f yourdir) # recreate the directory to have it empty
cd yourdir

(यदि आप yourdirइसके स्थान पर उपयोग करते हैं $(readlink -f yourdir)तो आप केवल लिंक को बदलेंगे जबकि मूल स्थान पूर्ण रहेगा)


1
यह फ़ोल्डर के इनोड पर भरोसा करने वाली चीजों को तोड़ सकता है, और अनुमतियाँ, atime / mtime / ctime / btime, विस्तारित विशेषताओं और अभिगम नियंत्रण सूचियों को फेंक सकता है।
डैनियल बेक

@DanielBeck धन्यवाद, अच्छे अंक। हालांकि मुझे आश्चर्य है कि, हार्डलिंक (निर्देशिकाओं पर, जो दृढ़ता से वैसे भी हतोत्साहित हैं) के अलावा इनोड पर क्या भरोसा करेगा? लेकिन परमिशन आदि जरूरी है। तो सबसे सामान्य मामले में शायद एक का उपयोग करना चाहिएxargs ...
टोबियास किन्ज़लर

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