30 दिनों से अधिक पुरानी फ़ाइलों को हटाने से पहले


8

मेरे पास कैश फ़ोल्डर है जिसमें न्यूनतम 15000 फाइलें हैं।

मैंने यह कोशिश की:

find cache* -mtime +30 -exec rm {} \;

लेकिन इससे मेरा सर्वर लोड आसमान पर उड़ गया!

क्या कोई तेज / बेहतर उपाय है?

या मैं इस कमांड की गति या पुनरावृत्तियों को सीमित कर सकता हूं ?


1
यदि cache*कई फ़ाइलों का विस्तार होता है, तो आप find . -name 'cache*' -mtime +30 -exec rm {} \;इसके बजाय कुछ आज़माना चाह सकते हैं ।
जैप एल्डरिंग

जवाबों:


10

मुझे tmpwatchइन चीजों के लिए उपयोग करना पसंद है , यह आखिरी बार है जब फ़ाइल को संशोधित किया गया था। यह सरल है और कई मामलों में अच्छा काम करता है:

tmpwatch -m 720 /path/to/cache

उबंटू के लिए, tmpreaperइसके बजाय जांचें ।

यदि आप अंतिम बार जांचना चाहते हैं कि फ़ाइल आपके द्वारा निम्न का उपयोग करने से एक्सेस की गई थी:

tmpwatch -a 720 /path/to/cache

आप फ़ाइल सिस्टम पर tmpwatch -a का उपयोग करने में सक्षम नहीं हैं, जो noatime के साथ माउंट किया गया है। आप अभी भी -m का उपयोग कर सकते हैं


मैं उपयोग कर रहा हूँ Ubuntu 10.04.2 LTSऔर यह आदेश मौजूद नहीं है ..
क्रिस्टियन

2
tmpreaperइसके बजाय @ क्रिसियन की जाँच करें ।
11

कोई भी नुकसान जब noatime विकल्प के साथ घुड़सवार filesystems का प्रबंधन करने के लिए इन का उपयोग कर?
AnonymousLurker

@AnonymousLurker मैंने आपके लिए जवाब को
संशोधित किया है

6

आप का उपयोग करके प्रत्येक फ़ाइल के लिए एक नई प्रक्रिया के spawning से बच सकते हैं

find cache* -mtime +30 -delete

3

अच्छा के साथ ऊपर चलाने की कोशिश करें:

nice -n 39 find cache* -mtime +30 -exec rm -f {} ';'

इस तरह से भारी भरकम भार तभी प्रकट होगा जब किसी और चीज को चलाने की जरूरत नहीं होगी, अन्यथा अन्य प्रक्रियाएं पूर्ववर्तीता ले लेंगी (यदि उनकी अच्छाई 19 से कम है यानी अधिकतम)।

ध्यान दें कि -n विकल्प में तर्क -20 और 19 के बीच भिन्नता वाले डिफ़ॉल्ट निकनेस में जोड़ा जाता है। मैंने 39 का उपयोग किया है, इसलिए यह बहुत अच्छा होगा कि मूल सुंदरता क्या थी।


2

जैसा कि चिबॉर्ग ने टिप्पणी की है, लोड हर फ़ाइल के लिए आरएम शुरू करने के कारण है। मैंने उस उत्तर पर ध्यान tmpwatchदिया जहां एक विकल्प के रूप में सुझाव दिया गया है, जो मुझे यकीन है कि अच्छी तरह से काम करता है। हालाँकि, यह आवश्यक नहीं है।

खोजें एक बार निष्पादित करने के लिए दी गई कमांड को चला सकते हैं, यदि आप इसे कहते हैं कि मिली फाइलों को तर्कों की सूची में संचित करें:

find /path -name "*.moo" -exec rm {} \+

यह कभी-कभी काम करने में विफल हो सकता है क्योंकि तर्क सूची शेल (गेटकोन ARG_MAX) द्वारा अनुमत अधिकतम से अधिक (बाइट्स में) बढ़ सकती है। इसे -L विकल्प के साथ xargs द्वारा हल किया जा सकता है।

इस उदाहरण पर विचार करें:

$ echo 0 > /tmp/it; 
$ for i in {0..15000};do echo $i;done  |\
    xargs --no-run-if-empty -L 5000 ./tmp/xr.sh 
Iteration=0; running with 5000 arguments
Iteration=1; running with 5000 arguments
Iteration=2; running with 5000 arguments
Iteration=3; running with 1 arguments

$ cat tmp/xr.sh 
#!/bin/sh
IT=`cat /tmp/it`
echo Iteration=$IT\; running with $# arguments
let IT=IT+1
echo $IT > /tmp/it

तो कोई अतिरिक्त सॉफ़्टवेयर स्थापित करने की आवश्यकता नहीं है, आपको केवल ग्नू-खोज्यूटिल्स की आवश्यकता है:

find /path -mtime +30 -print0 | xargs -0 -L 5000 rm 

कुछ d00d ने सोचा कि यह खोज और xargs को -0 -0 जोड़ने के लिए उपयोगी होगा। वे तर्क उनके आदेशों को अलग करने के लिए एक नई पंक्ति (\ n) के बजाय अशक्त चार (\ 0) का उपयोग करने के लिए मजबूर करते हैं। यह तब सहायक होता है जब फ़ाइल नाम में रिक्त स्थान या नई-रेखाएँ होती हैं।
урослав Рахматуллин

(१) आपको कहने की आवश्यकता नहीं है \+; मैदान +काफी अच्छा है। (2) यह "काम करने में विफल रहेगा क्योंकि तर्क सूची बड़ी हो सकती है ..."।  find  … -exec … {} +वही काम xargsकरेगा जो करेगा; इसे जितनी बार जरूरत होगी कमांड को चलाएंगे। उदाहरण के लिए (आपके उदाहरण के अनुसार), यदि आपके पास 15001 और 20000 फाइलें हैं, findतो चार बार -exec'd प्रोग्राम' ( rm) चलाएगा ।
जी-मैन का कहना है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.