2015-06-22 4 views
0

У меня есть требование создать скрипт для проверки имени файла. В источнике будет два файла, из которых начнется сбор данных Informatica. Один будет «Выполнять файл (текущий день: Sysdate)», а другой будет завершен/закрыт файл (предыдущий день: то есть с именем файла, выровненным с Sysdate -1). Теперь ETL должен забрать все файлы, кроме как в процессе. Файл (дата файла меньше, чем Sysdate). Предполагая, что текущий день «22/06/2015» - следующий список файлов, которые ETL можно ожидать, что в исходной папкеShell Script для проверки имени файла

filename_22/06/2015_ready.csv - этот файл должен быть проигнорирован filename_21/06/2015_ready.csv - этот файл должен быть обработан ETL

Пожалуйста, помогите мне, как я могу написать сценарий оболочки для выполнения этого требования.

ответ

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 {} + ', который дает мне все файлы, содержащие текущий файл. В выражении «найти. -type f -mtime +1 -exec ls -halt {} + 'Я получаю ошибку в отсутствии такого файла или каталога. –

+0

mmh, ok: from 'man find': * Когда вы обнаруживаете, сколько 24-часовых периодов назад последний доступ к файлу, любая дробная часть игнорируется, поэтому для сопоставления -time +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 

использовать этот сценарий и сделать изменения согласно вашему требованию я предоставил комментарии и код отладки.

В приведенном выше коде добавьте команду, чтобы отправить файл yesterdays в ETL в случае $ вчера. Я рассмотрел дату в формате ddmmyyy, пожалуйста, измените имя файла соответствующим образом.

Смежные вопросы