2

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

一个例子是:

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 中做到这一点?

4

2 回答 2

5

我不会解决你的全部问题,但我会给你一个开始的地方。其余的真的取决于你。

#!/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
于 2012-09-10T09:56:13.787 回答
0

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

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

它使用mtime每个文件的统计数据来构建一个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;
}
于 2012-09-10T12:17:13.573 回答