需要根据模式yyyymmdd对目录进行排序

时间:2014-02-15 06:03:01

标签: perl unix

我有一条路径,我将以“test_1.2.3_yyyymmdd”格式创建许多目录

  

e.g。 test_1.2.3_20140214

一个常见的事情是,我将始终将日期(以yyyymmdd格式)作为目录名称的一部分。理想情况下的文件 以不同的日期以相同的方式创建。

我的要求是根据目录名称中的日期字段对文件进行排序,我可以通过以下命令实现

ls | sort -t_ -k3,3

但是,有时可能会创建目录,而日期不是目录名的最后一个字段。即便在我想要的情况下 根据日期字符串对文件进行排序。有人可以告诉我如何实现这一目标。

如果我能够实现这种,那么我必须删除最旧的文件(基于yyyymmdd模式)。要求是路径应始终包含最新的10 基于上述排序的目录,如果超过10,那么我必须删除最旧的目录。

我不能指望查找命令,因为它不是基于-mtime

我想依靠UNIX工具/ Perl编程。

1 个答案:

答案 0 :(得分:1)

这是一个需要考虑的选项:

use strict;
use warnings;
use List::Util qw/min/;

my %files;

while ( my $file = <DATA> ) {
    chomp $file;
    my ($date) = $file =~ /([^_]+)$/;
    push @{ $files{$date} }, $file;
}

local $, = "\n";
print @{ $files{ min keys %files } };

__DATA__
test_1.2.3_20140214
test_A.B.C_20140214
test_X.Y.Z_20140212
test_1.2.3_20140210
test_4.5.6_20140210

输出:

test_1.2.3_20140210
test_4.5.6_20140210

$VAR1 = {
          '20140210' => [
                          'test_1.2.3_20140210',
                          'test_4.5.6_20140210'
                        ],
          '20140212' => [
                          'test_X.Y.Z_20140212'
                        ],
          '20140214' => [
                          'test_1.2.3_20140214',
                          'test_A.B.C_20140214'
                        ]
        };

首选使用split,但您提到日期字符串可能不是文件名的最后一部分。因此,您需要某种方式(split,正则表达式,...)才能获得它。

在上面的脚本中,这些日期用作数组散列(HoA)中的键,值是对文件路径列表的引用。来自List::Utilmin用于查找最小键值,因为这是最早的日期。

如果有多个文件具有相同的yyyymmdd,则使用HoA。

而不是print结果,将数组传递给unlink以删除文件,即unlink @{ $files{ min keys %files } };

哈希的Data::Dump显示其结构。

希望这有帮助!