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


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

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.

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


273
2017-11-27 16:43


मूल


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


जवाब:


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

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

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

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


231
2017-11-27 16:54



अधिकांश, लेकिन सभी सिस्टम नहीं पूछेंगे (मुझे लगता है)। कुछ की आवश्यकता है -i। - DaveParillo
अगर आप त्रुटि संदेश चाहते हैं, लेकिन त्रुटि निकास कोड नहीं, तो जवाब देखें गिएल बर्कर्स। मैं उपयोग करता हूं set -e मेरी सभी बैश स्क्रिप्ट में ताकि स्क्रिप्ट किसी भी कमांड के बाद बाहर निकल जाए। मैं अक्सर एक स्क्रिप्ट चाहता हूं कि मुझे बताएं rm एक त्रुटि दी, लेकिन वैसे भी जारी रखें। कायम है। - cledoux


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

अपने आदेश के बाद बस एक OR-कथन जोड़ें:

rm -rf my/dir || true

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


87
2018-03-09 12:39



यह त्रुटि को प्रिंट करता है और निष्पादन जारी रखता है, जो मेरे मामले के लिए वांछित था। - worldsayshi
या केवल rm -rf my/dir ||: और भी संक्षिप्त होना (: के लिए छोटा है true) - Godsmith
मेरी राय में बेहतर समाधान। यह आसानी से दिखाई दे रहा है कि क्या हो रहा है और परिणाम कोड को अनदेखा क्यों किया जाता है। मुझें यह पसंद है! - Mavamaarten


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

-rm lexer.ml interpparse.ml interpparse.mli

72
2017-12-23 23:12



यह अभी भी कंसोल में त्रुटि प्रिंट करेगा, जो आपको आउटपुट में त्रुटियों को अनदेखा करने के लिए प्रशिक्षित करता है, जो शायद आप नहीं चाहते हैं। आरएम-आरएफ मेरी राय में एक बेहतर विकल्प है। - Godsmith
@ गोडस्मिथ मैं रिकर्सिव डिलीट को मजबूर करने की बजाय एक त्रुटि को अनदेखा कर दूंगा। यह बहुत शरारती हो सकता है। और मेकफ़ाइल विशिष्ट वाक्यविन्यास के लिए +1 - Daishi
यदि आरएम-आरएफ "शरारती" हो सकता है, तो इसका मतलब है कि आप संस्करण नियंत्रण के तहत निर्देशिका के बाहर बनाने का उपयोग कर रहे हैं। क्यूं कर? - Godsmith
दस्तावेज के लिए एक लिंक दें, कृपया। इस सुविधा का विवरण मिल सकता है। - George Sovetov
@GeorgeSovetov gnu.org/software/make/manual/make.html#Errors - Robert Li


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

rm filethatdoesntexist 2> /dev/null 

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


8
2018-06-12 19:46



दुर्भाग्यवश यह अभी भी एक त्रुटि निकास कोड देगा। - Shaun McDonald


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


7
2017-11-27 16:48



ग्लोबिंग सवाल से बाहर होगा क्योंकि एक lexer.mll फ़ाइल है जिसे मैं हटाना नहीं चाहता हूं। यह दिखाने के लिए धन्यवाद कि क्यों उचित है। मुझे लगता है कि मैं बहुत से गुमराह होने के बाद अत्यधिक सावधानी बरतता हूं sudo rm -rf । - Jason Baker
एक और भी प्रतिबंधक नहीं है lexer.m? ...? वह पकड़ जाएगा lexer.ml तथा lexer.mz, लेकिन नहीं lexer.mll या lexer.mla। - JMD
@ जेएमडी: मुझे लगता है कि यह आपके खोल पर निर्भर करता है और ग्लोबिंग के लिए यह पैटर्न-मिलान समर्थन प्रदान करता है। - Nick Bastin


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

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

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


5
2017-11-27 19:27





शायद इस तरह की एक पंक्ति में मदद कर सकते हैं:

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

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


3
2018-03-11 10:36





एक विकल्प:

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

बहुत खराब मेकफ़ाइल लाइनों में शैल फ़ंक्शन परिभाषा साझा नहीं कर सकते हैं।


2
2017-11-27 17:44



क्या आपने पंक्ति के अंत में \ (बैकस्लैश) का उपयोग करने की कोशिश की है ताकि इसे अगले पर जारी रखा जा सके? - some
@some: हां, उन्हें कई लाइनों में फैलाया जा सकता है, लेकिन उन्हें व्यंजनों में साझा करने के लिए आपको परिभाषा को एक मेरिएबल में रखना होगा। - reinierpost


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

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

2
2018-06-11 13:55





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

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

0
2018-02-02 16:11