यदि कोई फ़ाइल मौजूद नहीं है, तो मैं rm को एक त्रुटि कैसे नहीं दूं?


329

मैं एक मेकफाइल लिख रहा हूं जो संकलन के अंत में कुछ बेकार फाइलों को साफ कर देगा। यदि कोई लक्ष्य पहले ही बनाया जा चुका है, तो यह निश्चित रूप से उस लक्ष्य को छोड़ देगा और बेकार फाइल नहीं हो सकती है। तो अगर मैं ऐसा करता हूं:

rm lexer.ml interpparse.ml interpparse.mli

मुझे त्रुटियाँ मिल सकती हैं क्योंकि फ़ाइलों में से एक मौजूद नहीं है। क्या rmइन फाइलों को अनदेखा करने का कोई तरीका है ?

मैन पेज पढ़ने में, मुझे निम्न विकल्प दिखाई देते हैं:

 -f          Attempt to remove the files without prompting for confirma-
             tion, regardless of the file's permissions.  If the file does
             not exist, do not display a diagnostic message or modify the
             exit status to reflect an error.  The -f option overrides any
             previous -i options.

यह लगभग वैसा ही लगता है जैसा मैं चाहता हूं, लेकिन मैं वास्तव में अनुमतियों के बारे में निश्चित नहीं हूं। क्या इसे करने का कोई तरीका है?


क्या आपने rmसैंडबॉक्स में कुछ आज़माया था? ऐसा लगता है -fकि वास्तव में आप क्या चाहते हैं, भले ही ग्लोबिंग हो।
JMD

यदि अनुमतियाँ इसे अनुमति नहीं देंगी, तो rm -fविकल्प के साथ अभी भी इसे हटाने का प्रयास करेगा। यह विफल हो जाएगा। यह आपको बताएगा कि यह विफल रहा। उपयोगी अगर फ़ाइल नाम एक चर या ग्लोब है।
लॉरेंससी

सिर्फ पूर्णता के लिए: एक त्रुटि से बाहर निकलने की स्थिति को वापस करने के अलावा ऐसा कुछ rm --interactive=neverकार्य rm -fहोता है। अधिक जानकारी के लिए यहां देखें: unix.stackexchange.com/questions/72864/…
lesmana

जवाबों:


282

-fविकल्प निश्चित रूप से क्या आप का उपयोग किया जा करना चाहते हैं।

फ़ाइल अनुमतियों के बारे में पुष्टि यह है कि यह है:

$ touch myfile    
$ chmod 400 myfile
$ rm myfile       
rm: remove write-protected regular empty file `myfile'?

तो rmआपको चेतावनी यदि आप किसी फ़ाइल तुम पर लिखने की अनुमति नहीं है को नष्ट करने की कोशिश करेंगे। यह अनुमति है यदि आपने निर्देशिका पर अनुमतियाँ लिखी हैं, लेकिन थोड़ी अजीब है, यही वजह है कि rmआम तौर पर आपको इसके बारे में चेतावनी देता है।


1
अधिकांश, लेकिन सभी सिस्टम नहीं पूछेंगे (मुझे लगता है)। कुछ की आवश्यकता है -i
डेविपरिलो

1
यदि आप त्रुटि संदेश चाहते हैं, लेकिन त्रुटि निकास कोड नहीं, तो Giel Berkers का उत्तर देखें । मैं set -eअपनी सभी बैश स्क्रिप्ट का उपयोग करता हूं ताकि स्क्रिप्ट किसी भी कमांड के त्रुटि के बाद बाहर निकल जाए। मैं अक्सर एक स्क्रिप्ट चाहता हूं कि मुझे बताएं कि क्या rmत्रुटि हुई है, लेकिन फिर भी जारी रखें। कायम है।
cledoux

124

एक अन्य समाधान यह है: https://stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command

अपने आदेश के बाद केवल एक OR-statement जोड़ें:

rm -rf my/dir || true

इस तरह, जब कथन # 1 विफल होता है (त्रुटि फेंकता है), कथन # 2 को चलाएं, जो कि बस है true


4
यह त्रुटि प्रिंट करता है और निष्पादन जारी रखता है, जो मेरे मामले के लिए वांछित था।
वल्र्डशी

9
या बस rm -rf my/dir ||:और भी अधिक संक्षिप्त (के :लिए कम है true)
गॉडस्मिथ

मेरी राय में बेहतर समाधान। यह आसानी से दिखाई देता है कि क्या हो रहा है और परिणाम कोड को अनदेखा क्यों किया गया है। मुझें यह पसंद है!
मावेमार्टन

76

मुझे पार्टी के लिए देर हो रही है, लेकिन मैं हर समय इसका उपयोग करता हूं। एक मेकफाइल में, -उस लाइन के रिटर्न मान को अनदेखा करने के लिए एक पंक्ति की शुरुआत में जोड़ें । इस तरह:

-r lexer.ml interpparse.ml इंटरपर्स ।.mli

9
यह अभी भी कंसोल पर त्रुटि प्रिंट करेगा, जो आपको मेक आउटपुट में त्रुटियों को अनदेखा करने के लिए प्रशिक्षित करता है, जो कि शायद आप क्या चाहते हैं। मेरी राय में rm -rf एक बेहतर विकल्प है।
गॉडस्मिथ

@Godsmith मैं पुनरावर्ती हटाने के लिए बाध्य करने के बजाय एक त्रुटि को अनदेखा करूंगा। यह बहुत शरारती हो सकता है। और मेकफाइल विशिष्ट सिंटैक्स के लिए +1
Daishi

यदि rm -rf "नॉटी" हो सकता है, तो इसका मतलब है कि आप संस्करण नियंत्रण के तहत एक निर्देशिका के बाहर का उपयोग कर रहे हैं। क्यों?
गॉडस्मिथ

कृपया दस्तावेज़ के लिए एक लिंक दें। इस सुविधा का वर्णन पा सकते हैं।
जॉर्ज सोवतोव


14

यदि आप -f विकल्प का उपयोग नहीं करना चाहते हैं, तो एक विकल्प है:

rm filethatdoesntexist 2> /dev/null 

यह सिर्फ त्रुटियों को मुद्रित होने से रखेगा।


9
दुर्भाग्य से यह अभी भी एक त्रुटि निकास कोड देगा।
शॉन मैकडॉनल्ड्स

8

यदि आपको फ़ाइल नामों को ग्लोब करने का कोई तरीका मिलता है , rmतो यह शिकायत नहीं करेगा कि क्या यह एक मैच नहीं मिल सकता है। तो जैसे कुछ lexer.m* interpparse.*आदि आपके लिए काम करना चाहिए (सावधान रहें कि आप बहुत ज्यादा नहीं हटा रहे हैं, बिल्कुल)। इसके अलावा, जाने के -fलिए एक पूरी तरह से उचित तरीका है, जब तक आप उम्मीद नहीं कर रहे हैं कि फ़ाइल अनुमतियाँ आपको उस फ़ाइल को हटाने से बचाएंगी जिसे आप नहीं चाहते थे - यदि आप इसे हटाना नहीं चाहते हैं, तो इसे न डालें सूची मैं।


ग्लोबिंग प्रश्न से बाहर होगा क्योंकि वहाँ एक lexer.mll फ़ाइल है जिसे मैं हटाना नहीं चाहता। क्यों -f उचित है दिखाने के लिए धन्यवाद। मुझे लगता है कि मैं बहुत अधिक पथभ्रष्ट होने के बाद अत्यधिक सावधान हो जाता हूं sudo rm -rf
जेसन बेकर

एक अधिक प्रतिबंधात्मक भी नहीं lexer.m?...? यह पकड़ सकता है lexer.mlऔर lexer.mz, लेकिन नहीं lexer.mllया lexer.mla
JMD

1
@ जेएमडी: मुझे लगता है कि यह आपके शेल पर निर्भर करता है और ग्लोबिंग के लिए यह किस पैटर्न-मिलान का समर्थन करता है।
निक बैस्टिन

6

-F विकल्प का अर्थ है कि यदि कुछ अपेक्षित नहीं है तो आपको संकेत नहीं दिया जाएगा। इसका मतलब यह नहीं है कि अनुमति को ध्यान में नहीं रखा गया है।

यदि आपके पास किसी फ़ाइल को निकालने के लिए पर्याप्त विशेषाधिकार नहीं हैं, तो उसे हटाया नहीं जाएगा।

लेकिन , यदि आपके पास विशेषाधिकार बदलने के लिए पर्याप्त विशेषाधिकार हैं, तो आप फ़ाइल निकाल देंगे। यह वह स्थिति है जब आप स्वामी (-r --------) के लिए आसानी से अनुमतियों वाली फ़ाइल के स्वामी होते हैं। मालिक के रूप में, आप कर सकते हैं chmod u+w, फिर इसे हटा दें: rm -fउस फ़ाइल को हटा देगा।


5

शायद इसके साथ एक रेखा की मदद कर सकता है:

touch fakefile.exe fakefile.o && rm *.o *.exe

मुझे पता है कि यह बहुत स्मार्ट नहीं है, लेकिन यह काम करता है।


3

एक विकल्प:

RmIfIsFile() {  for f in "$@"; do [ -f $f ] && rm $f; done; };  RmIfIsFile lexer.ml interpparse.ml interpparse.mli

बहुत बुरा Makefiles लाइनों के पार समारोह परिभाषाएँ साझा नहीं कर सकते।


क्या आपने अगली पंक्ति को जारी रखने के लिए एक पंक्ति के अंत में \ (बैकस्लैश) का उपयोग करने की कोशिश की है?
कुछ

@some: हाँ, उन्हें कई लाइनों में फैलाया जा सकता है, लेकिन उन्हें उन व्यंजनों के पार साझा करने के लिए, जिनकी परिभाषा आपको एक परिवर्तनशील चर में डालनी होगी।
रीयरियरपोस्ट 13

3

यहां मैं शेल स्क्रिप्ट्स में उपयोग करता हूं। यह त्रुटि संदेश और त्रुटि कोड छुपाता है।

rm doesnotexist 2> /dev/null || echo > /dev/null

कैसे के बारे मेंrm doesnotexist 2&> /dev/null
user8162

1

आप उन्हें rm करने से पहले फ़ाइलों को छू सकते हैं। अगर वे मौजूद नहीं हैं तो उन्हें पैदा करेगा :-)

touch lexer.ml interpparse.ml interpparse.mli
rm lexer.ml interpparse.ml interpparse.mli

1

लिखने rm -rf ppp>/dev/null 2>&1 आप नए प्राप्त त्रुटि संदेश समस्या तब होती है, यदि त्रुटि stderr के लिए नहीं 2 लेकिन STDOUT 1 उत्पन्न ... यह जगह ले जब आदेश त्रुटि लेकिन चेतावनी नहीं उत्पन्न है। आपको फ़िल्टर सेट करने और इस संदेश को निकालने की आवश्यकता है। लेकिन यह मामला साधारण है।


1

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

if [ -f lexer.ml ]; then
  rm lexer.ml
fi

यदि आप निश्चित रूप से मौजूद रहना चाहते हैं, तो अधिक परीक्षण खंड जोड़ें।

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