【问题标题】:Find files with wrong date given filename查找给定文件名的日期错误的文件
【发布时间】:2012-09-03 03:31:29
【问题描述】:

我有一个目录,其中的文件名称与日期递增后缀相同。

一个例子是:

REUTERS.FH_lbm_dump.20120905 

代表 9 月 5 日。

这些文件应该在第二天的前几分钟创建,例如上面的文件应该是在 9 月 6 日 00:01 创建的。

但是,由于文件名的生成方式存在一些错误,应用程序一直错误地保存它们。所以 9 月 5 日 00:16 创建的文件后缀为 20120905,即文件名晚了 1 天。

ls -h 的输出显示错误的命名:

2012-09-05 00:16 FH_lbm_dump.20120905

因此,检测这一点的逻辑将查看文件名,提取日期,如果它等于文件时间戳,则为正数。

我们如何在 Bash / Perl / Python 中做到这一点?

【问题讨论】:

标签: python ruby perl bash awk


【解决方案1】:

我不会解决你的全部问题,但我会给你一个开始的地方。剩下的就看你自己了。

#!/bin/bash

# loop through all filenames in current dir
for filename in *; do

    # How to extract the date from the file name
    date_from_file=${filename:(-8)}

    # How to get the file's modification date in the same format
    date_modified=$(stat -c %y "$filename" | cut -d ' ' -f1 | sed 's/-//g')

    # test for inequality
    if [ $date_from_file -ne $date_modified ]; then

        ... # do your thing

    fi

done

【讨论】:

    【解决方案2】:

    您应该使用Time::Piece 来处理日期,并使用File::stat 方便地访问文件统计数据

    该程序查找当前目录下所有后缀为八位的文件

    它使用每个文件的mtime stat 来构建一个Time::Piece 对象,减去一天,并将日期格式化为YYYYMMDD

    结果与实际文件后缀比较,如果不同则报文件不正确

    use strict;
    use warnings;
    
    use File::stat;
    use Time::Piece ();
    use Time::Seconds 'ONE_DAY';
    
    for my $file (glob '*') {
    
      next unless -f $file;
      my ($suffix) = $file =~ /([^.]+)\z/;
      next unless $suffix =~ /\A\d{8}\z/;
    
      my $dt = Time::Piece->new(stat($file)->mtime);
      $dt -= ONE_DAY;
      $dt = $dt->strftime('%Y%m%d');
    
      printf "File %s NOT CORRECT\n", $file unless $suffix eq $dt;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-05-25
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 2017-05-12
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      相关资源
      最近更新 更多