2015-06-22 128 views
0

我有一個要求創建一個腳本來驗證文件名。 從Informatica作業開始拾取這些文件的源中將有兩個文件。一個將是'進行中文件(當前日期:Sysdate)',另一個將是完成/關閉文件(前一天:即文件名與Sysdate -1對齊)。現在,ETL必須提取除進行中文件(文件日期小於系統日期)以外的所有文件。 假設當前日期是「22/06/2015」 - 以下是文件的那個ETL可以期待在源文件夾Shell腳本來驗證文件名

filename_22/06/2015_ready.csv看到名單 - 這個文件應該被忽略 filename_21/06/2015_ready.csv - 這個文件應該由ETL處理

請幫助我如何編寫shell腳本來滿足這個要求。

回答

0

您應該更好地使用find而不是讀取文件名的正則表達式。

命令像這些應該給你寫了一天的文件之前:

# print a list of all files older than one day expressed in minutes (60*24) 
find . -type f -mmin +$((60*24)) -exec ls -halt {} + 
# print a list of all files older than one day, expressed in multiple of 86400 seconds 
find . -type f -mtime +1 -exec ls -halt {} + 
+0

嗨,謝謝你的回覆。我試着'找到。 -type f -mmin +1 -exec ls {} +'這是給我所有文件包含今天的文件。在表達式'find'中。 -type f -mtime +1 -exec ls -halt {} +'我得到沒有這樣的文件或目錄的錯誤。 –

+0

mmh,ok:從'man find':*找到最後一次訪問該文件24小時前的數字時,將忽略任何小數部分,因此要匹配-atime +1,必須訪問文件至少在兩天前。*。這意味着你應該爲最後一天的文件使用'-mmin + $((60 * 24))'。 – Danduk82

0

嘗試以下操作:

#!/bin/bash 
    path="PathToYourFiles"; 
    `cd $path` 
    for i in `ls *.csv`; 
    do 
      filedate=`echo "$i" |grep -Eo '[[:digit:]]{8}'` 
      #echo "Filedate => $filedate"; 
      today=`date '+%d%m%Y'`; 
      yesterday=`date -d "1 day ago" '+%d%m%Y'`; 
      case "$filedate" in 
       $today) 
        echo "ignoring file its in progres"; 
        ;; 
       $yesterday) 
        echo "proces the file"; 
        ;; 
       *) 
        echo "invalid file to process"; 
        ##send it to ETL 
        ;; 

        #echo "today => $today ,yesterday => $yesterday" 
      esac 
    done 

使用這個腳本,並做修改,按您的要求,我所提供的意見並調試代碼也。

在上面的代碼中,添加命令將昨天的文件發送到$昨天的情況下的ETL。 我已經考慮過ddmmyyy格式的日期,請相應地更改文件名。