Perl 打开目录并按创建日期对文件进行排序

Perl 打开目录并按创建日期对文件进行排序,perl,file,sorting,Perl,File,Sorting,我需要打开目录,并在创建文件时对其进行排序。我可以找到一些讨论,使用Perl标记、排序和文件,根据修改日期对文件进行排序。我认为这比按创建日期排序更常见。我使用Perl。以前有一些帖子是关于用Perl以外的其他语言(如php或java)按创建日期排序的 例如,我需要执行以下操作: opendir(DIR, $ARGV[0]); my @files = "sort-by-date-created" (readdir(DIR)); clos

我需要打开目录,并在创建文件时对其进行排序。我可以找到一些讨论,使用Perl标记、排序和文件,根据修改日期对文件进行排序。我认为这比按创建日期排序更常见。我使用Perl。以前有一些帖子是关于用Perl以外的其他语言(如php或java)按创建日期排序的

例如,我需要执行以下操作:

opendir(DIR, $ARGV[0]);                             
my @files = "sort-by-date-created" (readdir(DIR)); 
closedir(DIR);

do things with @files...
CPAN在sort命令上有一个页面,但我无法访问它,而且在页面上找不到“date”或“creation”字样

作为对编辑的回应,我应该说我使用Mac操作系统10.7。我知道在Finder中,有一个按创建日期排序的选项,因此必须有某种类型的创建日期指示,以某种方式附加到该系统中的文件中

作为对答案的响应,下面是另一个尝试对文件进行排序的脚本版本:

#!/usr/bin/perl
use strict; use warnings;

use File::stat; # helps with sorting files by ctime, the inode date that hopefully can serve as creation date

my $usage = "usage: enter name of directory to be scanned for SNP containing lines\n";
die $usage unless @ARGV == 1;

opendir(DIR, $ARGV[0]);                             #open directory for getting file list
#my @files = (readdir(DIR));
my @file_list = grep ! /^\./, readdir DIR; 
closedir(DIR);  

print scalar @file_list."\n";

for my $file (sort {
        my $a_stat = stat($a);
        my $b_stat = stat($b);
        $a_stat->mtime <=> $b_stat->mtime;
    }  @file_list ) {
    say "$file";
}
#/usr/bin/perl
严格使用;使用警告;
使用文件::stat;#帮助按ctime排序文件,该索引节点日期有望用作创建日期
my$usage=“用法:输入要扫描的包含行的SNP目录的名称\n”;
除非@ARGV==1,否则为$use;
opendir(DIR,$ARGV[0])#打开目录以获取文件列表
#my@files=(readdir(DIR));
我的@file_list=grep!/^\./,readdir;
closedir(DIR);
打印标量@文件列表。“\n”;
对于我的$file(排序){
我的$a_stat=stat($a);
我的$b_stat=stat($b);
$a_stat->mtime$b_stat->mtime;
}@file_列表){
说“$file”;
}
#/usr/bin/env perl
严格使用;
使用警告;
opendir(DIR,$ARGV[0]);
chdir($ARGV[0]);
my@files=sort{(stat($a))[10](stat($b))[10]}(readdir(DIR));
closedir(DIR);
打印连接(“\n”,@文件);

stat
为您提供文件的各种状态信息。其中字段10是ctime(在支持它的文件系统上),它是inode更改时间(不是创建时间)。

OSX将创建日期存储在Mac特定的元数据中,因此标准Perl文件系统函数不知道它。您可以使用模块访问此信息。

您可以通过向函数提供子例程或代码块来自定义排序顺序

  • 在此子或块中,您需要使用特殊变量
    $a
    $b
    ,这两个变量在比较时表示@数组中的值
  • 子或块需要返回小于、等于或大于
    0
    的值,以指示
    $a
    是否小于、等于或大于
    $b
  • 您可以使用特殊的比较运算符(
    表示数字,
    cmp
    表示字符串)来执行此操作
因此,默认排序
sort@numbers
相当于
sort{$a$b}@numbers

在按创建时间排序的情况下,可以使用函数获取有关文件的信息。它返回有关文件的一系列信息,其中一些可能不适用于您的平台。文件的最后修改时间通常是安全的,但创建时间不是。
ctime
(它返回的第11个值)尽可能接近(它表示*nix上的inode更改时间,win32上的创建时间),表示为从纪元开始的秒数,这很方便,因为这意味着您可以进行简单的数字排序

my @files = sort {(stat $a)[10] <=> (stat $b)[10]} readdir($dh);
my@files=sort{(stat$a)[10](stat$b)[10]}readdir($dh);
我不确定你是否也要过滤掉这些目录。如果是这样,您可能还需要使用
grep

我需要打开目录并按创建文件的时间对文件进行排序

你不能。创建时间根本不存在。类似*nix的操作系统可以跟踪三个时间元素:

  • mtime:这是上次修改文件的时间
  • atime:这是上次访问文件的时间
  • ctime:这是上次修改的时间
在Unix中,某些文件信息存储在inode中。这包括在获取文件的Perl
stat
时看到的各种内容。这是用户的名称、文件的大小、它所在的设备、链接计数,讽刺的是,还有mtime、atime和ctime时间戳

为什么没有创造时间?因为你会如何定义它?如果我移动一个文件呢?如果有新的创建时间(顺便说一句,ctime不会随着移动而改变)。如果我复制文件呢?新副本是否应该有新的创建时间?如果我复制了一份,然后删除了原件呢?如果我编辑了一个文件呢?如果我用编辑更改了文件中的所有内容,怎么样?或者我编辑了文件,然后将其重命名为一个全新的名称

即使在有文件创建时间的Windows上,也不会真正跟踪文件创建。它只跟踪目录条目的创建时间,这与
ctime
的工作类似。而且,您甚至可以通过Windows API修改此创建时间。我怀疑Mac的文件创建时间是HFS文件系统的遗物,实际上,文件创建时间并没有第一次创建目录项的时间那么长


正如其他人指出的那样。您可以在排序例程中添加一段代码,说明您希望排序的内容。这里有一个简单的例子。注意,我使用了它,它为旧的
stat
命令提供了一个很好的按名称界面。如果我使用旧的stat命令,我会得到一个数组,然后必须找出我想要的项目在数组中的位置。这里,
stat
命令为我提供了一个stat对象,我可以使用
mtime
atime
ctime
方法提取正确的时间

我还使用了
,这是一种比较
my @files = sort {(stat $a)[10] <=> (stat $b)[10]} readdir($dh);
#! /usr/bin/env perl

use 5.12.0;
use warnings;

use File::stat;

my $dir_name = shift;

if ( not defined $dir_name ) {
    die qq(Usage: $0 <directory>);
}

opendir(my $dir_fh, $dir_name);

my @file_list;
while ( my $file = readdir $dir_fh) {
    if ( $file !~ /^\./ ) {
        push @file_list, "$dir_name/$file"
    }
}
closedir $dir_fh;

say scalar @file_list;

for my $file (sort {
        my $a_stat = stat($a);
        my $b_stat = stat($b);
        $a_stat->ctime <=> $b_stat->ctime;
    }  @file_list ) {
    say "$file";
}
#!/usr/bin/env perl
use Mojo::File 'path';

my $files_list = path( '/whatever/dir/path/' )->list;

# Returns an array of Mojo::File
my @files = sort { $a->stat->ctime <=> $b->stat->ctime }
  map { $_ }  $files_list->each;

# Returns an array of paths sorted by modification date (if needed)
my @paths = map { $_->realpath->to_string } @files;