我有一条路径,我将以“test_1.2.3_yyyymmdd”格式创建许多目录
e.g。 test_1.2.3_20140214
一个常见的事情是,我将始终将日期(以yyyymmdd格式)作为目录名称的一部分。理想情况下的文件 以不同的日期以相同的方式创建。
我的要求是根据目录名称中的日期字段对文件进行排序,我可以通过以下命令实现
ls | sort -t_ -k3,3
但是,有时可能会创建目录,而日期不是目录名的最后一个字段。即便在我想要的情况下 根据日期字符串对文件进行排序。有人可以告诉我如何实现这一目标。
如果我能够实现这种,那么我必须删除最旧的文件(基于yyyymmdd模式)。要求是路径应始终包含最新的10 基于上述排序的目录,如果超过10,那么我必须删除最旧的目录。
我不能指望查找命令,因为它不是基于-mtime
我想依靠UNIX工具/ Perl编程。
答案 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::Util的min
用于查找最小键值,因为这是最早的日期。
如果有多个文件具有相同的yyyymmdd,则使用HoA。
而不是print
结果,将数组传递给unlink以删除文件,即unlink @{ $files{ min keys %files } };
。
哈希的Data::Dump显示其结构。
希望这有帮助!