2012-12-13 9 views
110

से अधिक उम्र निर्देशिका मैं निर्देशिका के रूप में नामित किया है को नष्ट करने के:शैल स्क्रिप्ट n दिनों

2012-12-12 
2012-10-12 
2012-08-08 

मैं निर्देशिका है कि एक bash खोल स्क्रिप्ट के साथ पुराने 10 दिन से कर रहे हैं कैसे हटा सकता हैं?

+0

क्या उनके वास्तविक निर्माण/संशोधन समय पर कोई संबंध नहीं था? चूंकि 'ढूंढ' नाम को देखे बिना कर सकता है ... – Wrikken

+0

उनके पास सृजन/संशोधन समय होना चाहिए साथ ही – bobsr

+3

"पुरानी" से आपका क्या मतलब है? क्या आप उस निर्देशिका का जिक्र कर रहे हैं जब निर्देशिका बनाई गई थी, उस समय इसकी सामग्री आखिरी बार बदल गई थी, या कुछ और? नीचे दिए गए कुछ उत्तरों से सावधान रहें; 'ctime' इनोड परिवर्तन समय है। निर्देशिका के लिए, जब निर्देशिका को निर्देशिका से जोड़ा या हटा दिया जाता है तो यह बदल जाता है। – ajk

उत्तर

262

यह रिकर्सिवली आप के लिए क्या करेंगे:

find /path/to/base/dir/* -type d -ctime +10 -exec rm -rf {} \; 

स्पष्टीकरण:

  • find: फ़ाइलें/निर्देशिका/लिंक आदि
  • /path/to/base/dir को खोजने के लिए यूनिक्स कमांड: निर्देशिका अपनी खोज शुरू करने के लिए।
  • -type d: केवल f Ind निर्देशिका
  • -ctime +10: केवल संशोधन समय के साथ लोगों पर विचार से अधिक उम्र के 10 दिनों के
  • -exec ... \;: ऐसे प्रत्येक पाया परिणाम के लिए, में निम्न आदेश कर ...
  • rm -rf {}: रिकर्सिवली निर्देशिका को निकालने के लिए मजबूर; {} भाग वह जगह है जहां खोज परिणाम पिछले भाग से प्रतिस्थापित हो जाता है।

वैकल्पिक रूप से , उपयोग:

find /path/to/base/dir/* -type d -ctime +10 | xargs rm -rf 

में थोड़ा और अधिक कुशल है कौन सा है, क्योंकि यह के बराबर है: के रूप में विरोध किया

rm -rf dir1 dir2 dir3 ... 

रहे हैं:

rm -rf dir1; rm -rf dir2; rm -rf dir3; ... 
विधि में

नोट:find के आधुनिक संस्करण के साथ पसंदीदा उपयोग के संबंध में नीचे मार्कमार्क की टिप्पणी भी देखें।

+29

'ढूंढ' के आधुनिक संस्करणों के साथ आप '' '' '' '' '' '' के साथ बदल सकते हैं और यह आपके लिए 'xargs' कॉल के समतुल्य होगा, जितनी फाइलें प्रत्येक 'exec' system call पर फिट होंगी: ' ढूंढो -टाइप डी-ऑक्टिम +10 -exec आरएम-आरएफ {} + ' –

+0

आप दोनों के लिए धन्यवाद। क्या मैं कमांड में किसी भी तरह पैरेंट निर्देशिका पास कर सकता हूं। – bobsr

+0

@bobsr अद्यतन उत्तर देखें: अपनी खोज शुरू करने के लिए मूल निर्देशिका को 'ढूंढ' के बाद पहले तर्क के रूप में निर्दिष्ट किया गया है। –

26

आप उदाहरण

/path/to/base/dir1 
/path/to/base/dir2 
/path/to/base/dir3 

के लिए, /path/to/base के तहत सभी सबडायरेक्टरियों हटाना चाहते हैं लेकिन आप रूट /path/to/base नष्ट करने के लिए नहीं करना चाहते हैं, तो आप -mindepth 1 और -maxdepth 1 विकल्प, केवल उपनिर्देशिकाओं का उपयोग करेंगे जो जोड़ने के लिए /path/to/base

-mindepth 1 मैचों से रूट /path/to/base को शामिल नहीं करता है।

-maxdepth 1तुरंत /path/to/base जैसे /path/to/base/dir1, /path/to/base/dir2 और /path/to/base/dir3 के तहत केवल मैच उपनिर्देशिका लेकिन यह इनमें से उपनिर्देशिका एक पुनरावर्ती ढंग से सूची नहीं होगा।तो इन उदाहरणों में उपनिर्देशिका सूचीबद्ध नहीं की जाएंगी:

/path/to/base/dir1/dir1 
/path/to/base/dir2/dir1 
/path/to/base/dir3/dir1 

और बहुत आगे।

तो, /path/to/base के तहत सभी उप-निर्देशिकाओं को हटाने के लिए जो 10 दिनों से अधिक पुराने हैं;

find /path/to/base -mindepth 1 -maxdepth 1 -type d -ctime +10 | xargs rm -rf 
3

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

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

tmpreaper -t 5d ~/Downloads 


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

मूल स्रोत link

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

0

या

rm -rf `find /path/to/base/dir/* -type d -mtime +10` 

अपडेट किया गया, इसके बारे में तेजी से संस्करण:

find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f 
+1

यह आसानी से अधिकतम कमांडलाइन लंबाई से अधिक हो सकता है। 'Xargs --show-limit' देखें। –

+1

रिक्त स्थान या अन्य विशेष शैल वर्ण वाले फ़ाइल नाम होने पर भी काम नहीं करेगा। – Carpetsmoker

+0

@ कार्पेट्समोकर '-प्रिंट 0'/'-0' विशेष शैल वर्णों का ख्याल नहीं रखता है, या नहीं? – mpen

8

find-delete कार्रवाई का समर्थन करता , इसलिए:

find /base/dir/* -ctime +10 -delete; 

मुझे लगता है कि एक पकड़ है कि फ़ाइलों को भी 10+ दिन पुराना होना चाहिए। कोशिश नहीं की है, कोई टिप्पणी में पुष्टि कर सकता है।

सबसे अधिक मतदान वाला समाधान यहां -maxdepth 0 गुम है, इसलिए इसे हटाने के बाद, प्रत्येक उपनिर्देशिका के लिए rm -rf पर कॉल किया जाएगा। यही कारण है कि कोई मतलब नहीं है, तो मैं सुझाव है:

find /base/dir/* -maxdepth 0 -type d -ctime +10 -exec rm -rf {} \; 

-delete समाधान ऊपर -maxdepth 0 क्योंकि find उपयोग नहीं करता है शिकायत करेगा dir खाली नहीं है। इसके बजाए, यह -depth का तात्पर्य है और नीचे से हटा दिया जाता है।

+0

मैं '-delete' कार्यों की पुष्टि कर सकता हूं, लेकिन जैसा कि आपने कहा था कि आप केवल खाली निर्देशिकाओं को हटाने के लिए इसका उपयोग कर सकते हैं, जैसे 'rmdir'। – CTodea