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

ES5*_*S55 7 sorting perl file

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

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

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

do things with @files...
Run Code Online (Sandbox Code Playgroud)

CPAN在sort命令上有一个页面,但它不是我可以访问的,我在页面上找不到"日期"或"创建"字样.

为了回应编辑,我应该说我使用Mac,OS 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";
}
Run Code Online (Sandbox Code Playgroud)

ste*_*enl 11

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

  • 在此子或块,你需要使用特殊的变量$a,并$b为他们相比,这所代表的价值从@array.
  • 子块或块需要返回小于,等于或大于的值,0以指示是否$a小于,等于或大于$b(分别).
  • 您可以使用特殊比较运算符(<=>对于数字,cmp对于字符串)来为您执行此操作.

所以默认排序sort @numbers相当于sort {$a <=> $b} @numbers.

在按创建时间排序的情况下,您可以使用stat函数来获取有关该文件的信息.它返回有关该文件的一系列信息,其中一些可能不适用于您的平台.文件的上次修改时间通常是安全的,但创建时间不是.在ctime(11日值返回)是接近你可以得到(它代表着在*nix,创建时间在Win32 inode修改时间),因为这意味着你被表示为自纪元以来的秒数,这是方便可以做一个简单的数字排序.

my @files = sort {(stat $a)[10] <=> (stat $b)[10]} readdir($dh);
Run Code Online (Sandbox Code Playgroud)

我不确定你是否也要过滤掉目录.如果是这种情况,您可能也想使用grep.