क्या rm ने रिपोर्ट नहीं की है जब कोई फ़ाइल गायब है?


38

मेरे पास एक बैश स्क्रिप्ट है जिसे मैं विभिन्न निर्देशिकाओं से फाइलें निकालना चाहता हूं। अक्सर, वे वहाँ नहीं होंगे क्योंकि वे उत्पन्न नहीं हुए थे और यह ठीक है। क्या स्क्रिप्ट में उस त्रुटि की रिपोर्ट न करने का एक तरीका है, लेकिन अगर आरएम के पास रिपोर्ट करने के लिए कुछ अन्य आउटपुट हैं?

वैकल्पिक रूप से, क्या फ़ाइल को हटाने के लिए उपयोग करने के लिए एक बेहतर कमांड है जो कम शोर होगा?

जवाबों:


65

-fविकल्प का उपयोग करें । यह मूर्खतापूर्ण रूप से नॉन-फ़्लेक्स फ़ाइलों को अनदेखा करेगा।

से man rm:

   -f, --force
          ignore nonexistent files and arguments, never prompt

["कभी नहीं संकेत" भाग का मतलब है कि (ए) -fकिसी भी पहले से निर्दिष्ट ओवरराइड करता है-i या -Iविकल्प को है, और (बी) लेखन-संरक्षित फ़ाइलों को बिना पूछे हटा दिया जाएगा।]

उदाहरण

बिना -f, rmगुम फाइलों के बारे में शिकायत करेंगे:

$ rm nonesuch
rm: cannot remove ‘nonesuch’: No such file or directory

इसके साथ -f, यह चुप हो जाएगा:

$ rm -f nonesuch
$

4
ओह, मैं नया हूं जो हटाने के लिए संकेत नहीं करता था, यह महसूस नहीं किया कि यह भी कोई नहीं देखा। मैं पूरी तरह से उस पर छोड़ दिया जब आदमी को देख रहे हैं। :-) धन्यवाद। जैसे ही मुझे अनुमति होगी मैं इसका उत्तर दूंगा।
झिलमिलाहट

9

आपकी आवश्यकता है कि है rmलापता फाइलों के बारे में शिकायत नहीं है, लेकिन है कि आप भी किसी भी चाहते हैं अन्य से उत्पादन rm, मेरे सुझाव लक्ष्य फ़ाइल के अस्तित्व के लिए पहला परीक्षण करने के लिए हो सकता है, और केवल कॉल rm( बिना-f झंडा) यदि फ़ाइल वास्तव में मौजूद है।

# rest of script
# ...
[ -e "$file" ] && rm "$file"
# ...
# rest of script

rm -fएक फ़ाइल पर कॉल करना, उदाहरण के लिए, उपयोगकर्ता-लिखने की अनुमति नहीं है, फ़ाइल को हटा देगा और उस परिदृश्य के लिए सामान्य प्रॉम्प्ट का भी उत्सर्जन नहीं ।

यदि आप एक से अधिक फ़ाइलों के साथ एक ही विचार का उपयोग करना चाहते हैं, तो मैं एक फ़ंक्शन परिभाषा बनाऊंगा, जैसे:

qrm() {
  for f
  do
    [ -e "$f" ] && rm "$f"
  done
}

इसका उपयोग करें जैसे: qrm file1 file2-does-not-exist *.txt etc here


1
यह दौड़ की स्थिति की बहुत कम संभावना के बारे में पता होने के लायक है, जहां परीक्षण और निष्कासन के बीच फ़ाइल को हटा दिया जाता है (या बनाया जाता है), लेकिन मैं कल्पना नहीं कर सकता कि किसी भी विशिष्ट स्थिति में प्रासंगिक होना जहां एक शेल स्क्रिप्ट का उपयोग करना होगा ।
डेविड जेड

7

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

आप इस तरह से एक कमांड का उपयोग करना चाहेंगे:

rm -f filename 3>&1 1>&2 2>&3 3>&- | grep -v 'No such file or directory'

कमांड समझाया:

  • -f तर्क के माध्यम से बल और पुष्टि या त्रुटियों के लिए संकेत नहीं है
  • 3>&1 1>&2 2>&3 3>&-फ़िल्टरिंग के लिए STDOUT और STDERR के आसपास स्विच करना है ( यदि आप चाहते हैं तो इसके बारे में यहां और अधिक पढ़ सकते हैं
  • | grep -v 'No such file or directory' उस संदेश को फ़िल्टर कर रहा है जिसे आप नहीं देखना चाहते हैं

अब, यदि आप पूरी तरह से त्रुटि संदेशों को दबा देना चाहते हैं, तो आप निम्नलिखित कमांड चला सकते हैं:

rm filename 2> /dev/null

यह कमांड STDERR को / dev / null में रीडायरेक्ट करता है ताकि आप कमांड चलाते समय इसे न देखें।


1
(AFAICS) rmबिना स्टैडआउट के -vकेवल आउटपुट के बिना , केवल स्टेडर, इसलिए इस मामले में आप 2>&1 | grepबिना डांस के बस सकते हैं जो आम तौर पर उपयोगी है,
dave_thompson_085

4

एक विकल्प के रूप में, आप विकल्प के findसाथ कमांड का उपयोग कर सकते हैं -delete। यह (जाहिर है) केवल उन फ़ाइलों को हटा देता है जो यह पाता है कि यह कभी भी चेतावनी नहीं देता है यदि कोई नहीं है। एक उदाहरण हो सकता है:

find /var/log/triffids/ -name "*.log" -mtime 30 -delete

जो /var/log/triffids/निर्देशिका .logखोजेगा और प्रत्यय के साथ सभी फाइलों को हटा देगा जिन्हें 30 दिनों से अधिक के लिए संशोधित नहीं किया गया है।

यह हमेशा इन आदेशों को चलाने के लिए एक अच्छा विचार है बिना-delete पहला विकल्प, यकीन है कि यह फाइल को आप उम्मीद कर पाने के है बनाने के लिए।


मुझे यह विकल्प पसंद है और मैं बदलाव पर विचार करूंगा। इसे शेयर करने के लिए धन्यवाद।
झिलमिलाहट

3

चेक --force( -fका) विकल्प rm:

-फ, --फोर्स

कोई भी फ़ाइल और तर्क की उपेक्षा न करें, कभी भी संकेत न दें


2

यह एक हैक है, लेकिन आप हमेशा touchफ़ाइल को हटाने के बारे में सोच सकते हैं । यदि यह मौजूद नहीं है, तो इसे बनाया जाएगा ताकि rmइसे हटाया जा सके।


मुझे यह पसंद है, प्रदर्शन को छोड़कर - केवल K को हटाने के लिए कई K फ़ाइलों को छूने के लिए कितना महंगा है जो मौजूद नहीं है?
दानी_ल

0

आप -fमैन पेज के अनुसार इसका उपयोग कर सकते हैं :

फ़ाइल की अनुमति की परवाह किए बिना, पुष्टि के लिए संकेत दिए बिना फ़ाइलों को हटाने का प्रयास करें। यदि फ़ाइल मौजूद नहीं है, तो एक नैदानिक ​​संदेश प्रदर्शित न करें या त्रुटि को प्रतिबिंबित करने के लिए निकास स्थिति को संशोधित करें। यह भी याद रखें कि -f विकल्प किसी भी पिछले -i विकल्प को ओवरराइड करता है।

rm -f xyz-directory

आपको कुछ भी संकेत नहीं देगा, और जैसा आप चाहते हैं वैसा ही करेंगे।


-1

दो मुख्य तरीके हैं: यदि आप -f विकल्प जोड़ते हैं, तो यह "मौजूद नहीं है" त्रुटि दिखाएगा और दो: (लगभग किसी भी कमांड के लिए काम करता है) केवल "thecommand" करने के बजाय thecommand 2> / dev करें / null "जहां" thecommand "वह कमांड है जो आप कर रहे हैं।


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