ইউনিক্সের পাঁচ দিনের চেয়ে পুরানো ফাইলগুলি সরিয়ে ফেলুন (ফাইলের নামের তারিখ, টাইমস্ট্যাম্প নয়)


10

আমি কোনও ডিরেক্টরি থেকে 5 দিনেরও বেশি পুরানো লগ ফাইলগুলি মুছতে চাই। তবে মোছা ফাইলের টাইমস্ট্যাম্পের ভিত্তিতে হওয়া উচিত নয়। এটি ফাইলের নামের উপর ভিত্তি করে হওয়া উচিত। উদাহরণস্বরূপ আজকের তারিখ 07/05/2012 এবং ডিরেক্টরির মতো নামগুলি 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

জিএনইউ তারিখ কমান্ড কাজ করছে না .. :( 5 দিন আগের তারিখ পাওয়ার জন্য অন্য কোনও উপায়?
নালু

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

জিএনইউ তারিখ কমান্ড কাজ করছে না .. :( 5 দিন আগের তারিখ পাওয়ার জন্য অন্য কোনও উপায়?
নালু

1
@ নরেন: আপনি কী ওএস চালু করছেন? আপনি গনুহ তারিখ না থাকে তাহলে, আমরা জানতে হবে কি আপনার আছে না।
মাদুর

Uname -a সাহায্যে নিম্নলিখিত তথ্য পেয়েছিলাম: "SunOS badap01t 5.10 Generic_141444-09 sun4u sparc SUNW, SPARC-এন্টারপ্রাইজ"
Nalu

প্রশ্ন অবশেষ: বর্তমান তারিখটি পেতে আপনার কাছে কোন আদেশ রয়েছে?
ব্রাম

যদি টিসিএল ইনস্টল করা থাকে: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

পরিবর্তে আপনি যা করতে পারেন তা হ'ল আপনার ফাইলের নামগুলি কালানুক্রমিক ক্রমে বাছাই করা হবে use উদাহরণস্বরূপ, শেষ 5 টি ফাইল রাখতে:

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

3
rmআপনি যতবার না প্রতিবার বিড়ালছানা হত্যা করছেন তা না জানলে xargs ব্যবহার করবেন না । এটি কেবল একটি খারাপ ধারণা, যদি আপনি না কেন কিছু গবেষণা করেন এবং শিখেন যে যে কোনও সমস্যার কাছে যাওয়ার জন্য সর্বদা আরও ভাল উপায় রয়েছে যা এর সমাধান হতে পারে।
কালেব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.