2012-09-10 49 views
2

我有一個目錄,其文件的名稱是通用的後綴增加日期。找到錯誤的日期文件給出的文件名

一個例子是:

REUTERS.FH_lbm_dump.20120905 

表示九月五日。

這些文件應該是在第二天的前幾分鐘創建的,例如,上述文件應該在9月6日00:01創建。

但是,由於文件名如何生成的一些錯誤,應用程序一直在錯誤地保存它們。因此9月5日00:16創建的文件的後綴爲20120905,即文件名爲1天太晚。從ls -h

輸出,顯示了錯誤的命名:

2012-09-05 00:16 FH_lbm_dump.20120905 

所以邏輯來檢測,這將看文件名,提取日期,如果它等於文件的時間戳這將是積極的。

我們如何在Bash/Perl/Python中做到這一點?

+3

歡迎使用堆棧溢出!我們鼓勵你[研究你的問題](http://stackoverflow.com/questions/how-to-ask)。如果你已經[嘗試了某些東西](http://whathaveyoutried.com/),請將其添加到問題中 - 如果沒有,請先研究並嘗試您的問題,然後再回來。 – 2012-09-10 09:25:00

回答

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 
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; 
} 
相關問題