【问题标题】:Ux modify timestampux 修改时间戳
【发布时间】:2014-09-23 09:32:15
【问题描述】:

我正在尝试编写 Ux 脚本来更改时间戳(添加 10 年)。它在 Debian 上工作,但不知道如何在 Solaris 上做到这一点(-d 和 + 10 年不工作)

find DIRECTORY -print | while read filename; do
   touch -d "$(date -r "$filename") + 10 years" "$filename"
done

【问题讨论】:

    标签: bash perl unix timestamp solaris


    【解决方案1】:

    10*365*24*3600 秒的形式增加十年,

    find DIRECTORY -print|perl -MFile::stat -lne 'utime((stat($_)->mtime +10*365*24*3600) x2, $_)'
    

    如果File::stat 不可用,

    find DIRECTORY -print|perl -lne 'utime(((stat($_))[9] +10*365*24*3600) x2, $_)'
    

    【讨论】:

    • 这实际上不是 10 年 - 因为闰年,它短了 3 天。不过,这对于 OP 来说可能已经足够接近了:)
    • @Sobrique 是的,正确的;这就是为什么我写了未来多少秒。
    • @Sobrique |perl -MTime::Piece -lne 'utime((localtime((stat($_))[9])->add_years(10)->epoch) x2, $_)' 用旧版 perl 抛出 Day too big,而且 Solaris 没有定期升级的声誉。
    • 在 Linux 和 Perl 5.8.8 上运行良好 - 所以取决于 Solaris 落后于曲线多远。 (我确实必须安装 Time::Piece)。
    【解决方案2】:

    要更改 perl 上的 'mtime',您需要 utime 函数来设置它,并且需要 stat 函数来读取它。

    Time::Piece 可用于计算日期,使用add_years 函数。

    并且可以使用File::Find 模块完成遍历。

    给你类似的东西:

    #!/usr/bin/perl
    
    use strict;
    use warnings; 
    
    use File::Find;
    use Time::Piece;
    
    sub set_mtime_10years {
      my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
       $atime,$mtime,$ctime,$blksize,$blocks)
           = stat($File::Find::name);
    
      my $timestamp = localtime ( $mtime );
         $timestamp = $timestamp -> add_years ( 10 );
    
      #utime sets mtime and atime - set to undef if you only want to change one. 
      utime ( $timestamp -> epoch, #atime
              $timestamp -> epoch, #mtime
              $File::Find::name );
    }
    
    find ( \&set_mtime_10years, "." ); 
    

    这将遍历'.',读取每个文件的mtime,将其添加10年并将其写入文件。

    【讨论】:

      【解决方案3】:

      使用Path::Class::RuleTime::Piece

      use strict;
      use warnings;
      
      use Path::Class::Rule;
      use Time::Piece;
      
      for my $file ( Path::Class::Rule->new->file->all('mydir') ) {
          my $ts = localtime( $file->stat->mtime );
          next if $ts > time;    # Already in the future
          utime( ( $ts->add_years(10)->epoch ) x 2, "$file" );
      }
      

      【讨论】:

        猜你喜欢
        • 2014-10-11
        • 2010-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-21
        • 2010-10-12
        • 2021-02-23
        • 1970-01-01
        相关资源
        最近更新 更多