X घंटे से अधिक पुरानी फ़ाइलों को कैसे हटाएं


191

मैं एक बैश स्क्रिप्ट लिख रहा हूं जिसमें पुरानी फाइलों को हटाने की जरूरत है।

वर्तमान में इसका उपयोग करके लागू किया गया है:

find $LOCATION -name $REQUIRED_FILES -type f -mtime +1 -delete

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

हालांकि, क्या होगा अगर मुझे 1 दिन के लिए एक महीन संकल्प की जरूरत है, जैसे 6 घंटे पुरानी है? वहाँ ऐसा करने के लिए एक अच्छा साफ तरीका है, जैसे कि खोज और समय का उपयोग कर रहा है?

जवाबों:


303

क्या आपके findपास -mminविकल्प है? अंतिम संशोधन के बाद से आप मिनटों की संख्या का परीक्षण कर सकते हैं:

find $LOCATION -name $REQUIRED_FILES -type f -mmin +360 -delete

या हो सकता tmpwatchहै कि समान काम करने के लिए उपयोग करें। phjr ने tmpreaperटिप्पणियों में भी सिफारिश की ।


2
--Mmin + X का उपयोग करके सभी फाइलों को मेरी खोज के साथ लौटाता है। यह पहले नहीं जाँचने के लिए मेरी गलती है, लेकिन इस कमांड ने मेरे होम डाइरेक्टरी को सबसे ज्यादा डिलीट कर दिया। मेरे लिए, --mmin -X सही तर्क है।
ब्रेंडन

tmpreaper tmpwatch का कांटा है। यह सुरक्षित है, और डिस्ट्रो में डेबियन पैकेज के रूप में मौजूद है। ढूढने से अधिक लाभ: tmpreaper सिम्लिंक, सॉकेट, फीफो, या विशेष फाइल को नहीं निकालेगा
नादिर

इंगित करें कि $ REQUIRED_FILES को उद्धरणों (दोहरे उद्धरण चिह्नों) में होना चाहिए और आप एक पैटर्न का उपयोग कर सकते हैं जैसे: " .txt" सभी .txt फ़ाइलों या फ़ाइलों के लिए जिसकी शुरुआत एक पैटर्न से होती है जैसे: "temp- " जिसका नाम temp के साथ रखा गया है। -
अचसिंह

@PaulDixon यह कैसे इतना है कि संशोधित करने के लिए $LOCATIONऔर $REQUIRED_FILESदोनों तरह के रूप में अधिक मान सकते हैं dir1 dir2और *.txt *.tmp?
11

@Enissay $ LOCATION एक एकल निर्देशिका है। कई एक्सटेंशन के लिए आप शायद -regex के साथ एक पैटर्न का उपयोग करना चाहते हैं - देखें stackoverflow.com/questions/5249779/…
पॉल डिक्सन

9

आप इस ट्रिक को कर सकते हैं: 1 घंटे पहले एक फ़ाइल बनाएँ, और -newer fileतर्क का उपयोग करें ।

(या touch -tऐसी फाइल बनाने के लिए उपयोग करें)।


1
कोई भी फ़ोल्डर स्विच नहीं है (कम से कम मेरी खोज कमांड में), और इसकी आवश्यकता होगी। -newer मदद नहीं करता है।
आइकनोकॉस्ट

क्या आप एक टच कमांड दे सकते हैं जो 1 घंटे पुरानी एक ऐसी फ़ाइल उत्पन्न करेगा जो उन मशीनों पर काम करेगा जो उपयोग नहीं कर सकते हैं -मिनल? (यदि आप लिनक्स पर हैं, -mmin उपलब्ध है, अगर नहीं तो तारीख और अन्य आदेश भी तुलना में कमज़ोर हैं।)
iconoclast

2
@iconoclast touch -t $(date -d '-1 hour' +%Y%m%d%H%M.00) testफ़ाइल testहमेशा 1 घंटे पुरानी है।
rovr138

4

यहाँ दृष्टिकोण है कि मेरे लिए काम किया है (और मुझे नहीं लगता कि यह ऊपर इस्तेमाल किया जा रहा है)

$ find /path/to/the/folder -name *.* -mmin +59 -delete > /dev/null

फ़ोल्डर्स को छोड़ते समय 59 मिनट से अधिक पुरानी सभी फ़ाइलों को हटाना।


एकल-उद्धरण '*.*'या शेल से बेहतर इसे findहल करने के लिए वाइल्डकार्ड के रूप में रखने के बजाय वास्तविक फ़ाइलनाम में विस्तारित होगा । यह findउपखंडों पर पुनरावर्ती संचालन को तोड़ता है ।
17

यह भी ध्यान रखें कि -name '*.*'उन फ़ाइलों को डिलीट नहीं करेंगे README, जिनका कोई एक्सटेंशन नहीं है, जैसे Makefile, आदि
MestreLion

1

SunOS के लिए 5.10

 Example 6 Selecting a File Using 24-hour Mode


 The descriptions of -atime, -ctime, and -mtime use the  ter-
 minology n ``24-hour periods''. For example, a file accessed
 at 23:59 is selected by:


   example% find . -atime -1 -print




 at 00:01 the next day (less than 24 hours  later,  not  more
 than one day ago). The midnight boundary between days has no
 effect on the 24-hour calculation.

0

-मिनट मिनट के लिए है।

मैन पेज को देखने की कोशिश करें।

man find

अधिक प्रकारों के लिए।


0

यदि आपके पास "खोज" के संस्करण में "-mmin" नहीं है, तो "-mtime -0.041667" "अंतिम घंटे के भीतर" के बहुत करीब हो जाता है, इसलिए आपके मामले में, उपयोग करें:

-mtime +(X * 0.041667)

इसलिए, यदि X का अर्थ 6 घंटे है, तो:

find . -mtime +0.25 -ls

काम करता है क्योंकि 24 घंटे * 0.25 = 6 घंटे


उम्मीद थी क्योंकि इस पुराने UNIX में -mmin नहीं है, लेकिन, दुख की बात है कि यह कोई मदद नहीं है क्योंकि यह पुराना UNIX भी माइम के लिए आंशिक मूल्यों को पसंद नहीं करता है: खोजें: -MIME को तर्क -2251448483647 की सीमा में पूर्णांक होना चाहिए 2147483647
कुलब्रेन

0

यहाँ है कि कोई क्या कर सकता है जिस तरह से @iconoclast एक और जवाब पर उनकी टिप्पणी के बारे में सोच रहा था ।

उपयोगकर्ता या /etc/crontabफ़ाइल बनाने के लिए crontab का उपयोग करें /tmp/hour:

# m h dom mon dow user  command
0 * * * * root /usr/bin/touch /tmp/hour > /dev/null 2>&1

और फिर अपनी कमांड चलाने के लिए इसका उपयोग करें:

find /tmp/ -daystart -maxdepth 1 -not -newer /tmp/hour -type f -name "for_one_hour_files*" -exec do_something {} \;

*/1घंटे के लिए अपने crontab में बेमानी है। यह घंटे के क्षेत्र में * डालने के समान है।
colm.anseo


0

यदि किसी के findपास नहीं है -mminऔर यदि कोई भी इसके साथ अटका हुआ है , तो इसके findलिए केवल पूर्णांक मानों को स्वीकार करता है -mtime, तो सभी जरूरी नहीं खो जाते हैं यदि कोई मानता है कि "पुराने से" समान है "से नया नहीं"।

यदि हम एक ऐसी फ़ाइल बनाने में सक्षम थे जिसमें हमारे कट-ऑफ समय का एक मेल है, तो हम उन findफ़ाइलों का पता लगाने के लिए कह सकते हैं जो हमारी संदर्भ फ़ाइल से "नई नहीं" हैं।

एक फ़ाइल बनाने के लिए, जिसमें सही समय टिकट होता है, थोड़ा सा शामिल होता है क्योंकि एक सिस्टम जिसमें पर्याप्त नहीं होता है, findशायद एक कम-से-सक्षम dateकमांड भी होता है जो इस तरह की चीजें कर सकता है date +%Y%m%d%H%M%S -d "6 hours ago":।

सौभाग्य से, अन्य पुराने उपकरण जो इसे प्रबंधित कर सकते हैं, यद्यपि वे अधिक अवांछित तरीके से काम करते हैं।

गौर करें कि छह घंटे 21600 सेकंड हैं। हम उस समय को खोजना चाहते हैं जो छह घंटे पहले एक प्रारूप में है जो उपयोगी है:

$ date && perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'
> Thu Apr 16 04:50:57 CDT 2020
202004152250.57

पर्ल स्टेटमेंट ने एक उपयोगी तारीख का निर्माण किया, लेकिन इसे बेहतर उपयोग के लिए रखा जाना चाहिए:

$ date && touch -t `perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", \
  $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'` ref_file && ls -l ref_file
Thu Apr 16 04:53:54 CDT 2020
-rw-rw-rw-   1 root     sys            0 Apr 15 22:53 ref_file

अब इस पुराने UNIX का हल कुछ इस तरह है:

$ find . -type f ! -newer ref_file -a ! -name ref_file -exec rm -f "{}" \;

यह हमारी संदर्भ फ़ाइल को साफ करने के लिए एक अच्छा विचार हो सकता है ...

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