उपनिर्देशिकाओं के साथ x दिनों से अधिक पुरानी फ़ाइलों को हटाने के लिए स्क्रिप्ट को बैश करें


37

मैं x दिनों की तुलना में पुरानी एक टन फ़ाइलों को हटाने की कोशिश कर रहा हूं।

अब मेरे पास ऐसा करने के लिए एक स्क्रिप्ट है

find /path/to/files* -mtime +10 -exec rm {} \; 

लेकिन यह उपनिर्देशिकाओं को भी हटा देगा। एक टन फ़ोल्डर हैं, लेकिन मैं उन्हें रखना चाहूंगा, और उक्त फ़ोल्डरों के भीतर 10 दिनों से अधिक पुरानी फ़ाइलों को हटा दूंगा।

क्या इसे करने का कोई तरीका है?

जवाबों:


50

type परिणामों को छानने का विकल्प

findtypeउदाहरण के लिए, केवल फ़ाइलों के चयन का विकल्प स्वीकार करता है ।

find /path/to/files -type f -mtime +10 -delete

-deleteयह दिखाने के लिए छोड़ दें कि यह क्या हटाएगा, और एक बार जब आप सत्यापित कर लेते हैं, तो आगे बढ़ें और पूरी कमांड चलाएं।

यह केवल फाइलों पर चलेगा, निर्देशिकाओं पर नहीं। -type dउलटा, केवल लिस्टिंग निर्देशिका के लिए उपयोग करें जो आपके तर्कों से मेल खाती हैं।


अतिरिक्त विकल्प

आप पढ़ना चाहते हैं man find, क्योंकि भविष्य में आपके लिए कुछ और विकल्प हो सकते हैं। उदाहरण के लिए, -maxdepthआपको केवल एक विशेष गहराई तक पाए जाने वाले आइटम को प्रतिबंधित करने की अनुमति देगा, उदाहरण के -maxdepth 0लिए उपनिर्देशिका में पुनरावृत्ति नहीं होगी।

कुछ टिप्पणी

  • मुझे आश्चर्य है कि कमांड ने एक फ़ोल्डर कैसे निकाला होगा, क्योंकि आप rmकेवल एक फ़ोल्डर नहीं निकाल सकते । आपको इसके लिए आवश्यकता होगी rm -r

  • साथ /path/to/files*ही भ्रामक भी। क्या आपका मतलब है /path/to/files/या आप वाइल्डकार्ड को कई फ़ाइल और फ़ोल्डर नामों तक विस्तारित करने की उम्मीद कर रहे हैं?

  • शेल द्वारा व्याख्या की जाने वाली प्रतिस्थापित फ़ाइल / निर्देशिका नाम से बचने के लिए {}, एकल उद्धरण में रखें '{}', जैसे हम एक बैकस्लैश के साथ अर्धविराम की रक्षा करते हैं।


वैसे तो बहुत सारे फोल्डर / पाथ / टू / फाइल्स / वास्तव में मैं उनमे से प्रत्येक फोल्डर में mtime +10 -exec rm चलाना चाहता हूं, लेकिन फोल्डर को अपने पास रखें, मूल रूप से मैं यह हासिल करना चाहूंगा कि सभी डिलीट करें 10 दिनों से अधिक पुरानी फ़ाइलें और सभी फ़ोल्डर रखें। मैं एक नया खेद सॉर्ट कर रहा हूँ, जो नयापन है :)
JoyIan Yee-Hernandez

ठीक है, तुम वहाँ जाओ :) बस एक करो find /path/to/files* -type f -mtime +10और देखो कि यह क्या आउटपुट होगा।
19

हाँ, जब संदेह में, ऐसा मत करो -exec, बस देखो क्या यह पहले पाता है।
रॉब

2
@ JoyIanYee-Hernandez आप -deleteतर्क का उपयोग भी कर सकते हैं find, जो सभी फ़ाइलों और फ़ोल्डरों को हटा देता है, बाद में केवल खाली होने पर। इसका मतलब है -depth, गहराई-पहली खोज।
डैनियल बेक

1
@ क्रेकर तब आपको -mindepth 1मूल निर्देशिका को बाहर करने के लिए जोड़ना होगा।
slhck

5

पिछले उत्तरों की तरह (दोनों के लिए +1) ट्रिक को -type fविधेय का उपयोग करना है।

ध्यान दें, कि -exec rm '{}'आप के बजाय भी -deleteविधेय का उपयोग कर सकते हैं । लेकिन ऐसा मत करो। साथ -exec rm '{}'आप (और चाहिए) पहले कर सकते हैं -exec echo rm '{}'सत्यापित करने के लिए यह है कि आप वास्तव में क्या चाहते हो। इसके बाद कमांड को फिर से चलाएँ बिना echo

का उपयोग करते हुए -deleteतेजी से (बिना किसी अतिरिक्त है fork()और execve()प्रत्येक फ़ाइल के लिए), लेकिन इस वजह जोखिम भरा है -deleteएक शर्त है, तो के रूप में भी काम करता है:

# delete *.tmp files
find . -type f -name '*.tmp' -delete

लेकिन अगर आप केवल तर्कों को स्वैप करते हैं:

# delete ALL files
find . -type f -name '*.tmp' -delete

यदि आपको कभी भी जरूरत है findऔर rmफ़ाइलों के टन के लिए तेजी से काम करने के लिए, find ... | xargs ... rmUNIX मुहावरे की जाँच करें ।


4
मुझे लगता है कि आपके पिछले दो उदाहरण बिल्कुल समान हैं, शायद इसे ठीक करना चाहते हैं!
'18

1

आप इसे आसानी से खोज कमांड के साथ कर सकते हैं

$ find -type f

जो टाइप फ़ाइल के परिणाम को प्रतिबंधित करता है


1

मैं ऊपर दिए गए लिपियों और कुछ अन्य लिपियों का उपयोग करके इस अधिकार को प्राप्त करने के लिए संघर्ष कर रहा था, खासकर जब फ़ाइलों और फ़ोल्डर के नामों में न्यूलाइन या स्पेस थे।

अंत में tmpreaper पर ठोकर खाई और यह हमारे लिए अब तक बहुत अच्छा काम किया है।

tmpreaper -t 5d ~/Downloads


tmpreaper  --protect '*.c' -t 5h ~/my_prg

मूल स्रोत लिंक

परीक्षण जैसी विशेषताएं हैं, जो निर्देशिकाओं की पुनरावृत्ति की जाँच करता है और उन्हें सूचीबद्ध करता है। हटाते समय एक निश्चित पैटर्न के लिए सिम्बलिंक, फ़ाइलों या निर्देशिकाओं और सुरक्षा मोड को हटाने की क्षमता


0

के '+'बजाय आदेश का उपयोग करने में तेजी लाने के लिए\;

find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'

यह rmहर बार फ़ाइल मिलने के बजाय अंत में केवल एक बार चलेगा ।
( rmकई बार चलाया जा सकता है अगर आपके पास कमांड लाइन की लंबाई सीमा के कारण वास्तव में बहुत सारी फाइलें हैं, लेकिन यह अभी भी लगभग उतना ही तेज़ है -delete)


0

rm -f find /path/to/files -type file -mtime -5

यह 5 दिनों के भीतर संशोधित की गई फ़ाइलों को हटा देगा

rm -f find /path/to/files -type file -mtime +5

यह उन फ़ाइलों को हटा देगा जो पहले 5 दिनों से संशोधित हैं

5 से पहले और अंत में 'का प्रयोग करें।

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