UNIX में 5 दिनों से अधिक पुरानी फ़ाइलें निकालें (फ़ाइल नाम में दिनांक, टाइमस्टैम्प नहीं)


10

मैं लॉग फ़ाइलों को हटाना चाहता हूं जो एक निर्देशिका से 5 दिनों से अधिक पुरानी हैं। लेकिन विलोपन फ़ाइल के टाइमस्टैम्प पर आधारित नहीं होना चाहिए। यह फ़ाइल के नाम पर आधारित होना चाहिए। के लिए उदाहरण आज की तारीख 2012/07/05 और निर्देशिका जैसे नामों के 10 फ़ाइलें हैं ABC_20120430.log, ABC_20120429.log, ABC_20120502.log, ABC_20120320.logआदि मैं फ़ाइल का नाम से तारीख निकाल कर फ़ाइलें निकालने के लिए सक्षम होना चाहते हैं।

जवाबों:


2

फ़ाइल नाम से दिनांक के आधार पर:

THRESHOLD=$(date -d "5 days ago" +%Y%m%d)
ls -1 ABC_????????.log | 
  sed 'h;s/[_.]/ /g;G;s/\n/ /' | 
  while read A DATE B FILE
  do 
     [[ $DATE -le $THRESHOLD ]] && rm -v $FILE
  done

GNU दिनांक काम नहीं करने का आदेश देती है: :( तारीख पाने के लिए कोई अन्य तरीका जो 5 दिन पहले है?
Nalu

7

मुझे लगता है कि @ हेसलिंग में लगभग यह है: एलएस को पार्स न करें , और आप बैश में अधिक कर सकते हैं:

four_days=$(date -d "4 days ago" +%Y%m%d)
for f in ABC_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].log; do
  date=${f#ABC_}
  date=${date%.log}
  (( $date < $four_days )) && rm "$f"
done

GNU दिनांक काम नहीं करने का आदेश देती है: :( तारीख पाने के लिए कोई अन्य तरीका जो 5 दिन पहले है?
Nalu

1
@ टिप्पणी: आप किस ओएस पर हैं? यदि आपके पास जीएनयू तिथि नहीं है, तो हमें यह जानना होगा कि आपके पास क्या है।
चटाई

Uname -a की मदद से निम्नलिखित जानकारी मिली: "SunOS badap01t 5.10 Generic_141444-09 sun4u sparc SUNW, SPARC- एंटरप्राइज"
Nalu

प्रश्न शेष है: वर्तमान तिथि प्राप्त करने के लिए आपके पास क्या आदेश उपलब्ध हैं?
ब्रैम

यदि Tcl स्थापित है:four_days=$(echo "puts [clock format [clock scan {4 days ago}] -format %Y%m%d]" | tclsh)
ग्लेन जैकमैन

1

उपयोग करने का एक तरीका perl:

की सामग्री script.pl:

use warnings;
use strict;
use Time::Local qw/timelocal/;
use File::Spec;

## Process all input files.
while ( my $file = shift @ARGV ) { 

    ## Remove last '\n'.
    chomp $file;

    ## Extract date from file name.
    my ($date) = $file =~ m/.*_([^.]+)/ or next;

    ## Extract year, month and day from date.
    my ($y,$m,$d) = $date =~ m/(\d{4})(\d{2})(\d{2})/ or next;

    ## Get date in seconds.
    my $time = timelocal 0, 0, 0, $d, $m - 1, $y - 1900 or next;

    ## Get date in seconds five days ago.
    my $time_5_days_ago = time - 5 * 24 * 3600;

    ## Substract them, and if it is older delete it and print the
    ## event.
    if ( $time - $time_5_days_ago < 0 ) { 
        unlink File::Spec->rel2abs( $file ) and printf qq[%s\n], qq[File $file deleted];
    }   
}

इसका परीक्षण करने के लिए मैं कुछ फाइलें बनाता हूं:

touch ABC_20120430.log ABC_20120502.log ABC_20120320.log ABC_20120508.log ABC_20120509.log

उनके साथ की जाँच करें ls -1:

ABC_20120320.log                                                                                                                                                                                                                             
ABC_20120430.log                                                                                                                                                                                                                             
ABC_20120502.log                                                                                                                                                                                                                             
ABC_20120508.log                                                                                                                                                                                                                             
ABC_20120509.log                                                                                                                                                                                                                             
script.pl

स्क्रिप्ट को इस तरह चलाएं:

perl script.pl *.log

निम्नलिखित आउटपुट के साथ:

File ABC_20120320.log deleted
File ABC_20120430.log deleted
File ABC_20120502.log deleted

-1

इसके बजाय आप क्या कर सकते हैं इस तथ्य का उपयोग करें कि आपके फ़ाइलनाम कालानुक्रमिक क्रम में सॉर्ट करेंगे। उदाहरण के लिए, अंतिम 5 फाइलें रखने के लिए:

ls ABC_????????.log | head -n-5 | xargs rm

3
rmजब तक आप जानते हैं कि आप हर बार बिल्ली के बच्चे को मार रहे हैं, तब तक xargs का उपयोग न करें । यह सिर्फ एक बुरा विचार है, अगर आपको नहीं पता कि कुछ शोध क्यों करें और जानें कि किसी भी समस्या से निपटने के लिए हमेशा बेहतर तरीके हैं जो इसके लिए एक समाधान हो सकता है।
कालेब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.