繁体   English   中英

以修改时间的相反顺序列出早于一天的文件

[英]Listing files that are older than one day in reverse order of modification time

为了在目录上编写清理脚本,我需要查看所有早于一天的文件。 另外,我需要按照修改时间的倒序(最早的)删除它们,直到达到指定的大小为止。

我采用以下方法列出文件:

find . -mtime +1 -exec ls -a1rt {} +

我是对的,这不适用于大量文件(因为将执行多个“ ls”)吗? 在那种情况下我如何实现我的目标?

您可以使用以下命令查找10个最旧的文件:

find . -mtime +1 -type f -printf '%T@ %p\n' | sort -n | head -10 | awk '{print $2}'

使用的步骤:

  • 对于find返回的每个文件,我们将打印修改时间戳以及文件名。
  • 然后,我们根据时间戳进行数字排序。
  • 我们以10为首。
  • 我们仅打印文件名部分。

以后,如果要删除它们,可以执行以下操作:

rm $(...)

其中...是上述命令。

这是一个perl脚本,您可以使用它先删除给定目录中最旧的文件,直到该目录中文件的总大小减小到给定大小为止:

&CleanupDir("/path/to/directory/", 30*1024*1024);  #delete oldest files first in /path/to/directory/ until total size of files in /path/to/directory/ gets down to 30MB

sub CleanupDir {
  my($dirname, $dirsize) = @_;
  my($cmd, $r, @lines, $line, @vals, $b, $dsize, $fname);

  $b=1;
  while($b) {
    $cmd="du -k " . $dirname . " | cut -f1";
    $r=`$cmd`;
    $dsize=$r * 1024;

    #print $dsize . "\n";

    if($dsize>$dirsize) {
      $cmd=" ls -lrt " . $dirname . " | head -n 100";
      $r=`$cmd`;
      @lines=split(/\n/, $r);
      foreach $line (@lines) {
        @vals=split(" ", $line);
        if($#vals>=8) {
         if(length($vals[8])>0) {
            $fname=$dirname . $vals[8];
            #print $fname . "\n";
            unlink $fname;
          }
        }
      }
    } else {
       $b=0;
    }
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM