इस ट्यूटोरियल के अंत तक आप एक फ़ाइल, खाली डायरेक्टरी, पूरा डायरेक्टरी ट्री, और नाम या उम्र के आधार पर छांटी गई फ़ाइलें हटाना सीख जाएंगे। हर बार कार्रवाई से पहले आप निशाने की जांच भी करेंगे। Linux की कमांड लाइन में रीसायकल बिन नहीं होता: हटाई गई चीज़ हमेशा के लिए चली जाती है। इसलिए कमांड जितना ही तरीका भी मायने रखता है।
पूर्वापेक्षाएं
- किसी Linux मशीन का शेल एक्सेस (लोकल या SSH), उदाहरण के लिए एक Linux VPS
- संबंधित डायरेक्टरी में लिखने के अधिकार वाला यूज़र (या
sudo) - जो कुछ महत्वपूर्ण है, उसका हाल का बैकअप
हटाने से पहले निशाने की जांच करें
सही डायरेक्टरी में जाएं और उसकी सामग्री सूचीबद्ध करें। इसमें दो सेकंड लगते हैं और ज़्यादातर दुर्घटनाएं यहीं रुक जाती हैं।
Bashpwd ls -la
किसी पैटर्न (एक्सटेंशन, प्रीफ़िक्स) के लिए पहले देखें कि वह किन फ़ाइलों को छुएगा। rm ठीक यही सूची इस्तेमाल करेगा।
Bashls -d *.log
एक फ़ाइल हटाएं
बुनियादी कमांड rm है।
Bashrm report.txt
-i जोड़ने पर यह पुष्टि मांगता है, और -v जोड़ने पर बताता है कि क्या हटा रहा है।
Bashrm -iv report.txt
इसके बाद ls report.txt से जांचें: "No such file or directory" संदेश आए तो फ़ाइल हट चुकी है।
कई फ़ाइलें एक साथ हटाएं
शेल के वाइल्डकार्ड से फ़ाइलों का समूह चुना जा सकता है। पहले ls से सूची देखें, फिर हटाएं।
Bashrm -v *.tmp rm -v photo_{01..05}.jpg
ऐसे डायरेक्टरी में सीधे rm * चलाने से बचें जिसके बारे में आप निश्चित नहीं हैं। अगर किसी फ़ाइल का नाम हाइफ़न से शुरू होता है, तो विकल्पों के अंत का संकेत देने के लिए -- इस्तेमाल करें:
Bashrm -- -strange-file.txt
खाली डायरेक्टरी हटाएं
rmdir केवल खाली डायरेक्टरी हटाता है। यह जानबूझकर किया गया है: यह एक सुरक्षा कवच का काम करता है।
Bashrmdir old_folder
जो पैरेंट डायरेक्टरी खाली हो जाएं, उन्हें भी हटाने के लिए:
Bashrmdir -p project/cache/tmp
डायरेक्टरी और उसकी पूरी सामग्री हटाएं
इसके लिए रिकर्सिव विकल्प -r चाहिए। पहले अंदाज़ा लगा लें कि आप क्या खोने वाले हैं।
Bashdu -sh old_project find old_project -type f | wc -l
फिर पुष्टि के साथ हटाएं:
Bashrm -ri old_project
हज़ारों फ़ाइलों पर हर बार पुष्टि देना व्यावहारिक नहीं रहता। -f विकल्प इसे बंद कर देता है:
Bashrm -rf old_project
इस कमांड में कभी बिना जांची हुई वेरिएबल न रखें। rm -rf "$DIR"/ में अगर $DIR खाली हुआ, तो निशाना रूट डायरेक्टरी बन जाती है। स्क्रिप्ट में set -u जोड़ें या "${DIR:?}" इस्तेमाल करें, जो वेरिएबल खाली होने पर निष्पादन रोक देता है।
उम्र के आधार पर फ़ाइलें हटाएं
find सटीक मानदंडों (नाम, प्रकार, उम्र, आकार) पर छांटता है। सिद्धांत यह है: पहले बिना कोई कार्रवाई जोड़े चलाएं, फिर -delete लगाएं।
Bashfind /var/log/myapp -type f -name "*.log" -mtime +30
अगर सूची वही है जो आप चाहते थे:
Bashfind /var/log/myapp -type f -name "*.log" -mtime +30 -delete
-mtime +30 का मतलब है वे फ़ाइलें जो 30 दिन से ज़्यादा पहले बदली गई थीं। -delete को सबसे अंत में रखें: find शर्तों को बाएं से दाएं परखता है, और बहुत पहले रखा गया -delete सब कुछ हटा देता है।
संवेदनशील फ़ाइल को ज़्यादा सुरक्षित तरीके से मिटाएं
rm फ़ाइल की प्रविष्टि हटाता है, डिस्क का डेटा ज़रूरी नहीं कि मिटे। shred हटाने से पहले सामग्री को ओवरराइट कर देता है।
Bashshred -u -v secret.key
SSD, जर्नलिंग फ़ाइल सिस्टम या स्नैपशॉट वाले वॉल्यूम पर इस तरीके की सीमाएं हैं, क्योंकि वहां पुराना डेटा बचा रह सकता है। वाकई संवेदनशील डेटा के लिए शुरू से डिस्क एन्क्रिप्शन ही भरोसेमंद उपाय है।
आम त्रुटियां ठीक करें
Permission denied
पैरेंट डायरेक्टरी में आपके पास लिखने का अधिकार नहीं है (हटाने को फ़ाइल नहीं, पैरेंट डायरेक्टरी नियंत्रित करती है)। ls -ld DIRECTORY से जांचें, और उचित हो तो sudo इस्तेमाल करें:
Bashsudo rm -v /path/to/file
sudo के साथ भी Operation not permitted
संभावना है कि फ़ाइल पर immutable एट्रिब्यूट लगा है। उसे देखें, हटाएं, फिर फ़ाइल मिटाएं।
Bashlsattr file.txt sudo chattr -i file.txt sudo rm file.txt
Argument list too long
वाइल्डकार्ड ने सिस्टम की स्वीकार सीमा से ज़्यादा आर्गुमेंट बना दिए। find का सहारा लें, जो फ़ाइलों को एक-एक करके संभालता है:
Bashfind . -maxdepth 1 -type f -name "*.tmp" -delete
Directory not empty या Device or resource busy
rmdir के साथ पहला संदेश सामान्य है: डायरेक्टरी में फ़ाइलें हैं, छिपी हुई फ़ाइलें भी (ls -A)। अगर कोई माउंट पॉइंट या प्रक्रिया उसे इस्तेमाल कर रही है, तो lsof +D DIRECTORY या findmnt से उसे पहचानें और दोबारा कोशिश से पहले उसे मुक्त करें।
बिना जोखिम अभ्यास के लिए एक अस्थायी इंस्टेंस सुविधाजनक रहता है: VPS पर आप परीक्षण डायरेक्टरी बनाकर बिना किसी नुकसान के गलती कर सकते हैं। इसी तरह के और गाइड ट्यूटोरियल सेक्शन में एक जगह मिल जाएंगे।
FAQ
rm से हटाई गई फ़ाइल वापस मिल सकती है?
कम ही, और कोई गारंटी नहीं। अगर आप तुरंत डिस्क पर लिखना बंद कर दें, तो extundelete या testdisk जैसे टूल कभी-कभी डेटा खोज लेते हैं। एकमात्र भरोसेमंद सुरक्षा बैकअप ही है।
rm -r और rm -rf में क्या अंतर है?
rm -r रिकर्सिव रूप से हटाता है, लेकिन राइट-प्रोटेक्टेड फ़ाइलों पर पुष्टि मांगता है। rm -rf हटाने को ज़बरदस्ती करता है और जो फ़ाइलें मौजूद नहीं हैं उन्हें चुपचाप अनदेखा कर देता है। इसे केवल तभी इस्तेमाल करें जब आप निशाने की जांच कर चुके हों।
जिस डायरेक्टरी के नाम में स्पेस हो, उसे कैसे हटाएं?
नाम को उद्धरण चिह्नों में रखें या स्पेस से पहले बैकस्लैश लगाएं: rm -r "My folder" या rm -r My\ folder। ऐसा न करने पर शेल हर शब्द को अलग आइटम मान लेता है।
क्या कमांड लाइन में रीसायकल बिन जैसा कुछ है?
हां, trash-cli पैकेज (कमांड trash-put) के ज़रिए, जो चीज़ों को मिटाने के बजाय यूज़र के ट्रैश में ले जाता है। सर्वर पर यह आमतौर पर डिफ़ॉल्ट रूप से इंस्टॉल नहीं होता, इसलिए हटाने से पहले सूची देखने की आदत डालें।