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ファイル統計データへの便利なアクセスに使用する必要があります

このプログラムは、現在のディレクトリでサフィックスが8桁のすべてのファイルを検索します

mtime各ファイルの統計を使用してTime::Pieceオブジェクトを作成し、1日を差し引いて、日付を次のようにフォーマットします。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 に答える