我在目录中有一个文件列表,我想对其执行排序并获取最新文件。我不想使用最新的修改时间或创建时间。我想根据文件名进行排序。
文件名的格式为 DEV_TEST_DDMMYYYYHH24MISS.csv
我需要编写一个perl脚本,它将从目录中读取文件并根据文件名执行排序。
EX。文件名:
DEV_TEST_24032015121022.csv
DEV_TEST_04052015074942.csv
DEV_TEST_12052015074942.csv
DEV_TEST_05052015115948.csv
DEV_TEST_12022015115948.csv
脚本应返回DEV_TEST_12052015074942.csv
作为最新文件。
有人可以提出更好的方法吗?
如果有人可以提供排序逻辑就足够了。
答案 0 :(得分:2)
您可以使用Time::Piece
模块解析文件名中的数字以及List::UtilsBy
中的nsort_by
来命令您的文件名
看起来像这样
use strict;
use warnings;
use 5.010;
use Time::Piece;
use List::UtilsBy 'nsort_by';
my @names = <DATA>;
chomp @names;
my @sorted = nsort_by { Time::Piece->strptime(/(\d+)/, '%d%m%Y%H%M%S')->epoch } @names;
say for @sorted;
__DATA__
DEV_TEST_24032015121022.csv
DEV_TEST_04052015074942.csv
DEV_TEST_12052015074942.csv
DEV_TEST_05052015115948.csv
DEV_TEST_12022015115948.csv
<强>输出强>
DEV_TEST_12022015115948.csv
DEV_TEST_24032015121022.csv
DEV_TEST_04052015074942.csv
DEV_TEST_05052015115948.csv
DEV_TEST_12052015074942.csv
答案 1 :(得分:2)
很容易重新排列日期,以便可以对词汇进行排序。
按日期时间排序:
my @sorted =
map /\0(.*)/s,
sort
map {
my ($d,$m,$y,$t) = /(\d{2})(\d{2})(\d{4})(\d{6})/;
"$y$m$d$t\0$_"
}
@unsorted;
按照日期时间之前的任何内容排序,然后按日期时间排序:
my @sorted =
map /\0(.*)/s,
sort
map {
( my $fixed = $_ ) =~ s/(\d{2})(\d{2})(\d{4})(?=\d{6})/$3$2$1/;
$fixed . "\0" . $_
}
@unsorted;
答案 2 :(得分:0)
如果您的日期是YYYYMMDDHH24MISS
格式,那么简单的字母数字排序就足够了。如下文件名中的替换将使它们成为这种格式:
$filename =~ s/(\d{2})(\d{2})(\d{4})(\d{6})/$3$2$1$4/;