8

ディレクトリを開き、作成された時刻でファイルを並べ替える必要があります。Perl、ソート、およびファイルのタグを使用して、変更日に基づいてファイルをソートすることについての議論を見つけることができます。これは、作成日による並べ替えよりも一般的なニーズだと思います。私はパールを使用しています。php や java など、Perl 以外の言語での作成日による並べ替えに関する以前の投稿がいくつかあります。

たとえば、次のことを行う必要があります。

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

do things with @files...

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";
}
4

5 に答える 5

13

サブルーチンまたはコード ブロックをsort関数に提供することで、並べ替え順序をカスタマイズできます。

  • このサブまたはブロックでは、比較される @array の値を表す特別な変数$aおよびを使用する必要があります。$b
  • サブまたはブロックは、 (それぞれ)より小さい、等しい、またはより大きい0かどうかを示すために、より小さい、等しい、またはより大きい値を返す必要があります。$a$b
  • これを行うには、特別な比較演算子 (<=>数値cmp用、文字列用) を使用できます。

したがって、デフォルトのソートsort @numbersは と同等sort {$a <=> $b} @numbersです。

作成時間で並べ替える場合は、stat関数を使用してファイルに関する情報を取得できます。ファイルに関する一連の情報を返しますが、その一部はプラットフォームに適用できない場合があります。ファイルの最終変更時刻は一般的に安全ですが、作成時刻は安全ではありません。(ctime返される 11 番目の値) は、エポックからの秒数として表される (*nix では inode の変更時刻、win32 では作成時刻を表す) 限りなく近い値です。単純な数値ソートを実行できます。

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

ディレクトリも除外するかどうかはわかりません。その場合は、おそらく も使用する必要がありますgrep

于 2013-04-19T01:49:29.163 に答える
2

OS X は作成日を Mac 固有のメタデータに保存するため、標準の Perl ファイルシステム関数はそれを認識しません。MacOSX::Fileモジュールを使用して、この情報にアクセスできます。

于 2013-04-19T01:43:46.663 に答える
0

Mojo::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;
于 2020-02-17T17:29:42.223 に答える