N दिनों से पुराने निर्देशिकाओं को हटाने के लिए शेल स्क्रिप्ट


165

मैं निर्देशिका के रूप में नामित किया है:

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

मैं उन निर्देशिकाओं को कैसे हटाऊंगा जो 10 दिनों से अधिक पुरानी हैं, जो बैश शेल स्क्रिप्ट के साथ हैं?


1
क्या उनके वास्तविक निर्माण / संशोधन के समय पर कोई संबंध है? क्योंकि findबिना नाम देखे ही ऐसा कर सकते थे ...
विक्रेंक

उनके पास सृजन / संशोधन का समय उनके साथ होना चाहिए
बोबस्सर

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

जवाबों:


390

यह आपके लिए पुनरावर्ती करेगा:

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

स्पष्टीकरण:

  • find: फाइल / निर्देशिका / लिंक आदि खोजने के लिए यूनिक्स कमांड
  • /path/to/base/dir: अपनी खोज शुरू करने के लिए निर्देशिका।
  • -type d: केवल निर्देशिका खोजें
  • -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; ...

में के रूप में -execविधि।


के आधुनिक संस्करणों के साथ find, आप के ;साथ की जगह ले सकते हैं +और यह xargsआपके लिए कॉल के बराबर काम करेगा , प्रत्येक निष्पादन प्रणाली कॉल पर जितनी फाइलें फिट होंगी, उतने पास करें:

find . -type d -ctime +10 -exec rm -rf {} +

13
-mtimeमेरे लिए बेहतर था क्योंकि यह अनुमति परिवर्तनों के बजाय सामग्री परिवर्तनों की जाँच करता है, अन्यथा यह एकदम सही था।
क्विकशिफ्टिन

7
मुझे लगता है कि यह बेस डीआईआर को भी हटा देगा
या गल

3
@OrGal आप बिल्कुल सही हैं। आदेश में इस को रोकने के लिए, बस का उपयोग करें: find /path/to/base/dir/*
zloynemec

11
आप 1 -maxdepth का उपयोग निर्देशिकाओं की सामग्री की अनदेखी कर सकते हैं
सैम

7
यदि आपके पास हटाने के लिए बहुत सारे फ़ोल्डर हैं तो अधिक कुशल दृष्टिकोण बैकफ़ायर कर सकता है: stackoverflow.com/questions/11289551/… । उसी कारण से, आधार फ़ोल्डर को हटाने से बचने के लिए इसका उपयोग करना बेहतर है -mindepth 1(इसके बजाय /path/to/folder/*)।
ओहद श्नाइडर

41

यदि आप /path/to/baseउदाहरण के लिए, सभी उपनिर्देशिकाओं को हटाना चाहते हैं

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

लेकिन आप रूट को हटाना नहीं चाहते हैं /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

19

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नीचे से ऊपर की ओर है।


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

3

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

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

tmpreaper -t 5d ~/Downloads


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

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

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


2

या

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

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

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

2
यह आसानी से अधिकतम कमांडलाइन की लंबाई को पार कर सकता है। देख लो xargs --show-limits
माइकल क्रुप

2
यदि रिक्त स्थान या अन्य विशेष शेल वर्णों वाले फ़ाइलनाम नहीं हैं, तो भी काम नहीं करेगा।
मार्टिन Tournoij

@Carpetsmoker विशेष शेल वर्णों की देखभाल नहीं करता -print0/ करती है -0, या नहीं?
mpen

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