यदि यह पहले से ही खाली है, तो बिना निर्देशिका के फ़ाइलों को हटाएं


31

परिनियोजन स्क्रिप्ट के भाग के रूप में, मैं अपने टेम्प्लेट डायरेक्टरी से कुछ कैश्ड सामान डंप करना चाहता हूं। मैं एक कमांड का उपयोग करता हूं जैसे:

rm /tmp/our_cache/*

हालाँकि, अगर /tmp/our_cacheखाली है (हमारे परीक्षण सर्वर के त्वरित उत्तराधिकार में कई बदलावों को धक्का देते हुए काफी सामान्य), तो यह निम्न त्रुटि संदेश को प्रिंट करता है:

rm: cannot remove `/tmp/our_cache/*': No such file or directory

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

यूनिक्स में एक संक्षिप्त तरीका यह है कि निर्देशिका की सामग्री को हटाने के लिए संदेश प्राप्त किए बिना शिकायत करें कि निर्देशिका पहले से ही खाली है?

जवाबों:


48

चूँकि आप संभवत: बिना संकेत दिए सभी फाइलों को हटाना चाहते हैं, इसलिए -fस्विच का उपयोग rmन करने वाली फ़ाइलों को अनदेखा करने के लिए क्यों करें?

rm -f /tmp/our_cache/*

मैन पेज से:

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

इसके अलावा, अगर कोई उपनिर्देशिका हो सकती है /tmp/our_cache/और आप चाहते हैं कि उन और उनकी सामग्री को भी हटा दिया जाए, तो -rस्विच को न भूलें ।


3
सबसे स्पष्ट समाधान और मैंने इसके बारे में नहीं सोचा था! मैं इस कॉमिक xkcd.com/399 ;-) पर पहले आदमी की तरह महसूस करता हूं;
Huygens

6
find /tmp/our_cache/ -mindepth 1 -delete

संपादित करें 1

निकाल दिया गया "-type f

संपादित करें 2

गैर-मानक विकल्प जोड़ा गया -mindepth 1ताकि खोज रूट डायरेक्टरी को हटाया जा सके ( -type fसीमा हटाने के बाद )।


बस एक नोट, मैं बाहर छोड़ -type fदूंगा क्योंकि अस्थायी निर्देशिकाएं भी हो सकती हैं (हालांकि प्रश्न में उदाहरण उनके लिए नहीं है, इसलिए वे शायद वहां नहीं हैं ...)
इज़काता

1
उपयोग करने -type fसे केवल नियमित फ़ाइलों को हटा दिया जाएगा, इसलिए उदाहरण के लिए प्रतीकात्मक लिंक हटाए नहीं जाएंगे।
Huygens

@rush क्षमा करें, मैंने यह जांच नहीं की, लेकिन मैन पेजों पर एक नज़र थी जो किसी भी तरह निर्देशिकाओं का उल्लेख नहीं करते हुए "फाइलें हटाएं" कहते हैं। मैं अपनी टिप्पणी हटाता हूं।
हउक लागिंग

1
यह निकालता है /tmp/our_cacheताकि आप भी कर सकें rm -r /tmp/our_cache। जब आप गैर-मानक विकल्पों का उपयोग कर रहे हों, तो आप उपयोग कर सकते थे -mindepth 1। ध्यान दें कि इसके विपरीत rm /tmp/our_cache/*, यह उपनिर्देशिका और उनकी सामग्री और छिपी हुई फ़ाइलों को भी हटा देता है।
स्टीफन चेजलस

2

आप मानक त्रुटि को पुनर्निर्देशित कर सकते हैं /dev/nullताकि वह इसे प्रिंट न कर सके

$  rm /tmp/our_cache/* 2>/dev/null

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

यहां तक ​​कि अगर आप कुछ फ़ाइल को हटाने की कोशिश करते हैं जो कुछ प्रक्रिया खुल गई है, तो आपको कोई त्रुटि नहीं मिलेगी।
प्रदीपचेत्री

1

एक और तरीका (हालांकि थोड़ा ओवरकिल ...):

[ ! -z "$(ls -A /tmp/our_cache/)" ] && rm -rf /tmp/our_cache/*

यह उपयोग करता है testया [परीक्षण करता है कि क्या स्ट्रिंग lsआपकी निर्देशिका पर चलने से वापस आ गई है खाली नहीं है। तब यदि, और केवल अगर, वह स्ट्रिंग खाली नहीं है, तो यह आपकी निर्देशिका के तहत सब कुछ हटा देता है।

नोट: ग्लोब को छोड़ देने lsसे कोई फ़ाइलों की त्रुटि नहीं होगी।


-1

यदि आपकी स्क्रिप्ट हमारे लिए है तो आप कोशिश कर सकते हैं:

if test "$(ls /tmp/our_cache/)" !=  ""; then rm /tmp/our_cache/*; fi

ऐसा करने से "वास्तविक" समस्या होने पर या फ़ाइल संरक्षित होने पर भी आपको एक त्रुटि उत्पन्न होगी (आपको इस प्रकार की फ़ाइलों को हटाने -fके rmलिए संशोधक की आवश्यकता होगी), लेकिन कोई फ़ाइल नहीं होने पर त्रुटि से बचना होगा।

यदि आप अपनी स्क्रिप्टिंग के लिए BASH के अलावा किसी अन्य शेल का उपयोग करते हैं, जैसे zsh, ksh, तो आप इस अन्य सिंटैक्स को आज़मा सकते हैं जो अधिक पोर्टेबल हो सकता है:

if [[ "$(ls /tmp/our_cache/)" !=  "" ]]; then rm /tmp/our_cache/*; fi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.