शेल स्क्रिप्ट एक फाइल को हटाने के लिए यदि वह पहले से मौजूद है


183

मैं कुछ सामान पर काम कर रहा हूं जहां मैं एक फाइल में डेटा स्टोर कर रहा हूं। लेकिन हर बार जब मैं स्क्रिप्ट चलाता हूं तो वह पिछली फाइल से जुड़ जाती है।

मुझे मदद चाहिए कि अगर मैं फाइल पहले से मौजूद है तो मैं उसे कैसे हटा सकता हूं।


3
जांचें कि क्या फ़ाइल मौजूद है ... और फिर कॉल करें rm $my_file, है ना? आप किस खोल का उपयोग कर रहे हैं?
क्रिस स्प्रैग

जवाबों:


184

यदि फ़ाइल मौजूद है, तो उसे जाँचने की जहमत न करें, बस उसे हटाने का प्रयास करें।

rm -f /p/a/t/h
# or
rm /p/a/t/h 2> /dev/null

ध्यान दें कि यदि फ़ाइल मौजूद नहीं थी, तो दूसरी कमांड विफल हो जाएगी (एक गैर-शून्य निकास स्थिति लौटें), लेकिन पहला विकल्प के -fलिए (लघु --force) विकल्प के कारण सफल होगा । स्थिति के आधार पर, यह एक महत्वपूर्ण विवरण हो सकता है।

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

ध्यान दें कि आप कुछ ऐसा कर सकते हैं test -f /p/a/t/h && rm /p/a/t/h, लेकिन ऐसा करना पूरी तरह से व्यर्थ है। यह बहुत संभव है कि परीक्षण सही हो जाएगा, लेकिन / p / a / t / h आपके द्वारा इसे हटाने का प्रयास करने से पहले मौजूद नहीं होगा, या इससे भी बदतर होगा कि परीक्षण विफल हो जाएगा और / p / a / t / h बन जाएगा इससे पहले कि आप अगले आदेश को निष्पादित करें जो यह उम्मीद करता है कि यह मौजूद नहीं है। यह प्रयास एक क्लासिक दौड़ की स्थिति है। यह मत करो।


5
यह उपयोगी नहीं है अगर उन्हें यह जानने की आवश्यकता है कि क्या यह अस्तित्व में था और हटा दिया गया था। Stderr खाने से ऐसा नहीं होता है। अस्तित्व को न संभालना आपको विफल किए बिना एक विस्तृत स्क्रिप्ट चलाने देता है।
uchuugaka

@uchuugaka यह एक सरल उपाय है जब आपको परवाह नहीं है कि कोई फ़ाइल है या नहीं, आप जो चाहते हैं वह सुनिश्चित करना है कि यह वहां नहीं है।
लुकास लाइजिस

अच्छे उत्तर आने वाले हैं और साइड-इफ़ेक्ट के बारे में पूरा होना मेरे संदेश का सामान्यीकरण है, लेकिन शेल स्क्रिप्ट अक्सर जानना चाहते हैं कि क्या है और क्या नहीं मिला है और क्या है या कार्रवाई नहीं है।
uchuugaka

rm /p/a/t/h 2> /dev/nullecho $?यदि फ़ाइल मौजूद नहीं थी, तो रिटर्न कोड ( ) को 0 के रूप में नहीं रखेंगे । यह जेनकींस की नौकरियों को विफल कर देगा क्योंकि हमने एक गैर मौजूदा फ़ाइल को हटाने की कोशिश की थी।
वीएफआई

@uchuugaka - मैं काफी समय से इस टिप्पणी का जवाब देने से बच रहा हूं, लेकिन इस पर ध्यान देने की जरूरत है। यह हटाने से पहले कि फ़ाइल मौजूद है या नहीं, यह जाँचना हमेशा एक बुरा विचार है। मेरे उत्तर के अंतिम पैराग्राफ को देखें। एक अंतर्निहित दौड़ की स्थिति है कि बस उस तरह का काम करने से बचा नहीं जा सकता है। यदि आप किसी मौजूदा फ़ाइल को अधिलेखित नहीं करना चाहते हैं, तो आप कुछ शेल विशिष्ट जादू (जैसे noclobberबाश) में कोशिश कर सकते हैं , या हो सकता है कि मौजूदा फ़ाइल को चोद-इन करें, यदि फ़ाइल मौजूद नहीं है (तो रेस की स्थिति से बचें) लेकिन ऐसा करने से सभी कीड़े अधिक सूक्ष्म हो जाएंगे।
विलियम पर्ससेल ने

127

एक और एक लाइन कमांड जिसका मैंने उपयोग किया है:

[ -e file ] && rm file

11
या वैकल्पिक रूप से: [! -ई फाइल] || आरएम फ़ाइल। यह संस्करण कुछ त्रुटि के बजाय 0 देता है।
नवाफेल bgh

@nawfelbgh धन्यवाद, यह एक लंबी लिपि में जंजीर के लिए महान है।
अबे

83

आप इसका उपयोग कर सकते हैं:

#!/bin/bash

file="file_you_want_to_delete"

if [ -f $file ] ; then
    rm $file
fi

4
यह चयनित उत्तर होना चाहिए।
मई'18

सरल और पढ़ने में आसान और यह भी सुनिश्चित करता है कि echo $?यदि फ़ाइल मौजूद नहीं है तो 1 नहीं देता है।
वीआईएफआई

यदि आवश्यक हो, तो आप इसे एक-लाइनर के रूप में भी कर सकते हैं, नीचे मेरा जवाब देखें।
नबूकट

65

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

 rm -f xyz.csv

1
यह सिर्फ उच्चतम रेट जवाब का हिस्सा का डुप्लिकेट है, 2015 से
forgivenson

16
मुख्य उत्तर ने यह नहीं बताया कि इसके साथ -fकोई त्रुटि नहीं होगी। इस जवाब ने मेरी मदद की, धन्यवाद।
डग

डौग के साथ सहमत हालांकि यह एक प्रतिक्रिया की तरह एक विकी के लिए एक अच्छा उपयोग के मामले की तरह लगता है।
फिलिप

16

एक लाइनर शेल स्क्रिप्ट एक फाइल को हटाने के लिए यदि यह पहले से मौजूद है (जिंद्रा हेल्क्ल के उत्तर पर आधारित):

[ -f file ] && rm file

या एक चर के साथ:

#!/bin/bash

file="/path/to/file.ext"
[ -f $file ] && rm $file

13

कुछ इस तरह काम करेगा

#!/bin/sh

if [ -fe FILE ]
then 
    rm FILE
fi 

-यदि यह एक नियमित फ़ाइल है, तो जाँच करें

-अगर जाँचता है कि फ़ाइल मौजूद है या नहीं

अधिक जानकारी के लिए यदि परिचय

संपादित करें: -ई के साथ प्रयोग किया जाता है, बेमानी है, अकेले का उपयोग करने के लिए भी काम करना चाहिए


-aपदावनत किया जाता है, -eइसके बजाय उपयोग करें ।
mziccard

मेरी बुरी, नियत। धन्यवाद @mziccard
P1kachu

यह निर्देशिका या लिंक या अन्य गैर-सामान्य फ़ाइलों पर त्रुटियों को फेंक देगा। यह प्रयोग करने के लिए बेहतर / सुरक्षित है -f
जिंद्रा हेलक्ले

1
ठीक है। अभी भी, -eमें -feअनावश्यक है, के रूप में -fजहाँ तक मैं जानता हूँ कि यह भी जाँच करता है फ़ाइल के अस्तित्व ..
Jindra Helcl

अगर मैं संपादित करता हूं, तो मैं आपके उत्तर से एक डुप्लिकेट
बनाऊंगा

4

if [ $( ls <file> ) ]; then rm <file>; fi

इसके अलावा, यदि आप इसके >बजाय अपने आउटपुट को पुनर्निर्देशित करते हैं तो >>यह पिछली फ़ाइल को अधिलेखित कर देगा


3
यह एक-लाइनर नहीं है, क्षमा करें, लेकिन @liwp_Stephen एक है।
फियोरेंटीनोइंग

यहां तक ​​कि अगर ठीक से उद्धृत किया गया है, तो यह टूट जाता है अगर fileकुछ ऐसा है5 -lt 2
विलियम पर्ससेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.