Perl对文件创建时间的检索不正确

时间:2016-04-10 02:56:24

标签: macos perl datetime

我正在尝试使用perl根据文件所在的文件夹和创建的时间重命名文件。文件GOPR1521.MP4和GOPR7754.MP4是在同一时间和日期在两个不同的摄像机上创建的,我希望能够用它们的名字来表示。例如,在12:32:38创建的... / GoProTravisL / GOPR1521.mp4应该变为123238L_GOPR1520.mp4,而GOPR7754.MP4变为123239R_GOPR7754.MP4。现在唯一的问题是时间戳。我认为这是一个错误的时区或小时偏移的问题,但分钟也是关闭的。在获取时间戳时我是否缺少perl中的某些内容?下面是perl代码,它为每个文件输出的内容,以及OS X上的Finder所说的创建时间。

代码:

#!/usr/bin/perl


use Time::Piece;
use File::stat;
use File::Find;
use File::Basename;
use File::Spec;

@files = <$ARGV[0]/>;

find({ wanted => \&process_file, no_chdir => 1 }, @files);

sub process_file {
    my($filename, $dirs, $suffix) = fileparse($_,qr/\.[^.]*/);
    if ((-f $_) && ($filename ne "" )) {
        #print "\n\nThis is a file: $_";
        #print "\nFile: $filename";
        #print "\nDIR: $dirs";
        my(@parsedirs) = File::Spec->splitdir($dirs);

        my @strippeddirs;

        foreach my $element ( @parsedirs ) {
            push @strippeddirs, $element if defined $element and $element ne '';
        }
        $pardir = pop(@strippeddirs);
        #print "\nParse DIR: ", $pardir;
        #print "\nFile creation time: ";
        $timestamp = localtime(stat($_)->ctime)->strftime("%H%M%S"); #gives time stamp

        print $timestamp;
        $newname = $timestamp . substr($pardir,-1) ."_". $filename . $suffix;

        print "\nRename: $dirs$filename$suffix to $dirs$newname\n";
        #rename ($dirs . $filename . $suffix,$dirs . $newname) || die ( "Error in renaming: " . $! );
    } else {
        print "\n\nThis is not file: $_\n";
    }
}

每个文件的时间戳输出:

/Volumes/Scratch/Raw/2016-03-21/GoProTravisL/

File: GOPR1520
File creation time: 05-55-21
File: GOPR1521
File creation time: 05-56-18
File: GOPR1522
File creation time: 05-57-44
File: GOPR1523
File creation time: 05-58-49
File: GP011520
File creation time: 05-59-53

/Volumes/Scratch/Raw/2016-03-21/GoProTravisR

File: GOPR7754
File creation time: 06-02-48
File: GOPR7755
File creation time: 06-04-19
File: GOPR7756
File creation time: 06-06-27
File: GOPR7757
File creation time: 00-06-16
File: GP017754
File creation time: 00-19-30
File: GP027754
File creation time: 00-22-20

使用ls的实际文件时间:

MacTravis:2016-03-21 travis$ ls -lR /Volumes/Scratch/Raw/2016-03-21
total 0
drwxr-xr-x  8 travis  admin  272 Apr  9 21:25 GoProTravisL
drwxr-xr-x  9 travis  admin  306 Apr  9 21:25 GoProTravisR

/Volumes/Scratch/Raw/2016-03-21/GoProTravisL:
total 21347376
-rw-------  1 travis  admin  4001240088 Mar 21 12:04 GOPR1520.MP4
-rw-------  1 travis  admin  1447364149 Mar 21 12:31 GOPR1521.MP4
-rw-------  1 travis  admin  2140532053 Mar 21 12:45 GOPR1522.MP4
-rw-------  1 travis  admin  1649133454 Mar 21 13:00 GOPR1523.MP4
-rw-------  1 travis  admin  1691562945 Mar 21 12:21 GP011520.MP4

/Volumes/Scratch/Raw/2016-03-21/GoProTravisR:
total 31941008
-rw-------  1 travis  admin  4001129586 Mar 21 12:04 GOPR7754.MP4
-rw-------  1 travis  admin  2166255754 Mar 21 12:31 GOPR7755.MP4
-rw-------  1 travis  admin  3202301883 Mar 21 12:45 GOPR7756.MP4
-rw-------  1 travis  admin  2466803806 Mar 21 12:08 GOPR7757.MP4
-rw-------  1 travis  admin  4001257192 Mar 21 11:27 GP017754.MP4
-rw-------  1 travis  admin   516025454 Mar 21 11:29 GP027754.MP4

1 个答案:

答案 0 :(得分:3)

ctime是“上次状态更改的时间”,我认为是上次修改inode的时间。这不是文件的创建时间 [1] ls列出了文件修改时间,因此只需从使用ctime更改为使用mtime

  1. 从历史上看,unix文件系统上使用的文件系统不会跟踪创建文件的时间。有些article跟踪它,但我不确定如何访问它(这里也不需要)。