2015-04-14 2 views
0

У меня есть скрипт, он получает список файлов из файла списка и отправляет эти файлы на сервер с помощью SCP, а затем архивирует эти файлы.Как архивировать только текущий файл

Мне нужно изменить его, чтобы он работал только с файлами, КОТОРЫЕ СОЗДАНЫ СЕГОДНЯ (тогда скрипт запущен)!

Вот мой код -

exec 1> $CODE/WCC_FOA_RMBHUB/logs/rmb_to_afbs_ftp_$(date +"%Y%m%d_%H%M%S").log 2>&1 

    . $CODE/WCC_FOA_RMBHUB/parms/RMB_To_AFBS.parm 

    ListFilePath=$CODE/WCC_FOA_RMBHUB/lists 
    TgtFilePath=$PMDIR/TgtFiles/WCC_FOA_RMBHUB 
    ArchivePath=$PMDIR/SrcFiles/WCC_FOA_RMBHUB/Archives 
    Today=`date +%Y%m%d%H%M%S` 

    MasterAfbsFile=Master_File_RMB_To_AFBS.lst 

    while read TrgtFileName 
    do 

    ZippedFile=$TrgtFileName'.gz.'$Today 
    if [ -f $TgtFilePath/$TrgtFileName ] 
    then 
    echo AFBS Target File $TrgtFileName is available in the path $TgtFilePath 

##### NED TO ADD SOME IF CONDITION HERE TO CHECK IF THE FILE IS HAVING TODAYS DATE OR NOT ###### 

    echo Performing SCP 
    scp $TgtFilePath/$TrgtFileName [email protected]$MACHINE:..$DIRNAME 

          if [ $? -ne 0 ] 
            then 
            echo "ERROR while trying to move the $TrgtFileName to FTP bridge path" 
            exit $? ; 
            else 
            echo scp command executed successfully 
            echo "File $TrgtFileName is moved to the archival path" 
            gzip -c $TgtFilePath/$TrgtFileName > $ArchivePath/$ZippedFile 
            if [ $? -ne 0 ] 
            then 
            echo "ERROR while trying to move the $TrgtFileName to Archival path" 
            exit $? ; 
            else 
            echo "File Archival Successful" 
            rm $TgtFilePath/$TrgtFileName 
            fi 
          fi 

    else 
    echo AFBS target File $TrgtFileName is not available in the path $TgtFilePath 
    fi 

    done <$ListFilePath/$MasterAfbsFile 

Я попытался посмотреть на дату файла, используя Grep и найти команду, но я не смог приземлиться на совершенное динамическое решение, пожалуйста, помогите.

ответ

1

Edited: добавлено объяснение (просьба в комментариях)

Использование сенсорного -t YYMMDDHHMM.SS для referencefile в полночь:

touch -t $(date +%Y%m%d0000.00) /tmp/archive_date.tmp find $TgtFilePath -type f -newer /tmp/archive_date.tmp

С находкой и -mtime вы можете выбрать файлы меньше день. Это не решение, оно будет выглядеть 24 часа назад.
После касания /tmp/archive_date.tmp будет с последней полуночи. С помощью find вы можете искать файлы, которые являются более новыми, чем файл-файл. Находка отобразит файлы с сегодняшнего дня. Я добавил -type f, нас не интересуют каталоги.

В вашем коде вы используете Master_File_RMB_To_AFBS.lst для «белого списка» файлов, подлежащих обработке. Теперь у вас есть 2 списка, выход поиска и ваш «белый список». Я думаю, вам нужны только файлы, присутствующие в обоих файлах.
Поиск строк, разделяемых в 2 файлах, возможен с common -12, когда сначала сортируются оба файла. Использование sort + common должно быть лучшим решением для больших наборов файлов, но вам нужно 2 дополнительных файла tmp (отсортированные файлы) *)
*) В bash вы можете использовать подстановку процессов с < < <, избегая файлов tmp.

Решение под alse работает, когда пути, заданные поиском, являются относительными путями и файлами в полных путях Master_File_RMB_To_AFBS.lst.

Looping через вывод команды может быть сделано с for file in $(command); do и command | while read file; do
Я предпочитаю последний способ по ряду причин:

  • команда может возвращать пустую строку это время положит ничего в трубе, здесь ничего не происходит. Результатом будет неполная строка.
  • Я научился читать слева направо, трубы чувствуют себя естественно.
  • Хотя читает полные строки для сломает вход на пространствах (или то, что ваш МФС говорит)
  • Хотя можно разделить inputlines в словах/разные вары Не используется здесь, было бы что-то вроде while read field1 f2 f3 f_others

Внутри цикла с файлом $, найденным командой find, вы хотите проверить файл с помощью Master_File_RMB_To_AFBS.lst. Вам нужно только знать, найден ли файл. Я не использую grep -q, это не поддерживается всеми grep. Поэтому я использую параметр count -c.
myAction - это все, что вы написали в своем цикле while. Если вы хотите сделать его функцию, вы должны выбрать, как функция знает файл $. Можно просто выбрать его (используя его как глобальный var), но предпочтительной методике дается его как параметр myFunction "$file" и чтение параметра в myFunction.

Это приведет:

Если вы хотите проверить $ файл MasterAfbsFile, вы можете сделать петлю, как

find $TgtFilePath -type f -newer /tmp/archive_date.tmp | while read file; do 
    if [ $(grep -c "${file}" ${MasterAfbsFile}) -gt 0 ]; then 
     myAction "${file}" 
    fi 
done 
+0

Привет Можете ли вы объяснить, как это работает? –

+0

Привет, файл имеет имя файла с полным путем и поэтому он не может GREP его в Masterfile и, следовательно, он всегда выходит из if. Можете ли вы решить эту проблему? Thansk –

+0

Если вы не хотите редактировать мастер-файл (не бойтесь файлов с тем же именем в разных папках), вы можете использовать 'basename $ {file}' или использовать '$ {file ## * /}'. Нет времени, чтобы отредактировать мой ответ с этим. –

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