【问题标题】:Perl Script to remove files older than a yearPerl 脚本删除超过一年的文件
【发布时间】:2014-07-17 18:08:49
【问题描述】:

我正在尝试制作一个脚本来删除超过一年的文件。

这是我的代码:

#!/usr/bin/perl

$files = ".dat|.exe";
@file_del = split('\|',$files);
 print "@file_del";

 $dates = "365|365|365|365";
 @date_del = split('\|',$dates);
 if($#date_del == 0){
     for $i (@file_del){
         my $f = `find \"/Users/ABC/Desktop/mydata\" -name *$i -mtime +date[0]`;
         print "$f";
     }
  }
  else{
    for $i (0..$#file_del){
         my $f = `find \"/Users/ABC/Desktop/mydata\" -name *$file_del[$i] -mtime +$date_del[$i]`;
         print "$f";
    }
   }

我面临的问题:

  1. 它没有检测 .txt 文件,否则它正在检测 .data、.exe、.dat 等。
  2. -mtime 也是 365。但是闰年(366 天)我必须更改我的脚本。

【问题讨论】:

  • 如果年 % 4 == 0,则增加 1 天
  • 仅供参考,mtime 是文件内容最后一次更改的时间,而不是文件创建后的年龄。
  • 为什么要使用 Perl?只需将find 直接与-delete 选项一起使用即可。
  • 我的要求是 Perl 脚本。

标签: perl shell


【解决方案1】:
$myDir = "/Users/ABC/Desktop/mydata/";
$cleanupDays = 365
$currentMonth = (localtime)[4] + 1;
$currentyear = (localtime)[5] + 1900;
if ($currentMonth < 3) {
   $currentyear -= 1;
}
if( 0 == $currentyear % 4 and 0 != $currentyear % 100 or 0 == $currentyear % 400 ) {
    $cleanupDays += 1;
}
$nbFiles = 0;
$runDay = (time - $^T)/86400;    # Number of days script is running
opendir FH_DIR, $myDir
   or die "$0 - ERROR directory '$myDir' doesn't exist\n");
foreach $fileName (grep !/^\./, (readdir FH_DIR)) {
   if (((-M "$myDir$fileName") + $runDay) > $cleanupDays) {
      unlink "$myDir$fileName" or print "ERROR:NOT deleted:$fileName ";
      $nbFiles++;
   }
}
closedir FH_DIR;
print "$nbFiles files deleted\n";

【讨论】:

    【解决方案2】:

    使用出色的Path::Class 让生活变得轻松:

    use Modern::Perl;
    use Path::Class;
    
    my $dir = dir( '/Users', 'ABC', 'Desktop', 'mydata' );
    $dir->traverse( sub {
        my ( $child, $cont ) = @_;
        if ( not $child->is_dir and $child->stat ) {
            if ( $child->stat->ctime < ( time - 365 * 86400 ) ) {
                say "$child: " .localtime( $child->stat->ctime );
                # to delete:
                # unlink $child;
            }
        }
        return $cont->();
    } );
    

    【讨论】:

      【解决方案3】:

      您也可以使用命令find2perl。喜欢:

      find2perl . -mtime -365 -exec rm {} \;
      

      什么会产生一个 perl 脚本来使用File::Find - 例如:

      use strict;
      use File::Find ();
      use vars qw/*name *dir *prune/;
      *name   = *File::Find::name;
      *dir    = *File::Find::dir;
      *prune  = *File::Find::prune;
      
      sub wanted;
      File::Find::find({wanted => \&wanted}, '.');
      exit;
      
      sub wanted {
          my ($dev,$ino,$mode,$nlink,$uid,$gid);
      
          (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
          (int(-M _) < 365) &&
          (unlink($_) || warn "$name: $!\n");
      }
      

      【讨论】:

        猜你喜欢
        • 2021-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-16
        • 1970-01-01
        • 2018-05-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多