如何存档今天的文件

时间:2015-04-14 10:17:07

标签: shell unix unix-timestamp aix

我有一个脚本,它从列表文件中获取文件列表,并使用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 $USER_ID@$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和Find命令查找文件日期,但我无法找到完美的动态解决方案,请帮忙。

1 个答案:

答案 0 :(得分:1)

编辑:添加解释(在评论中要求)

在午夜使用touch -t YYMMDDHHMM.SS作为参考文件:

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

使用find和-mtime,您可以选择不到一天的文件。这不是一个解决方案,它会回顾24小时 触摸后/tmp/archive_date.tmp将从上午午夜开始。使用find,您可以查找比给定文件更新的文件。该查找将显示今天的文件。我添加了-type f,我们对目录不感兴趣。

在您的代码中,您使用Master_File_RMB_To_AFBS.lst作为白名单&#39;要处理的文件现在您有2个列表,查找输出和您的白名单&#39;。我想你只想要两个文件中都有的文件 当两个文件首先排序时,可以使用common -12查找在2个文件中共享的行。使用sort + common应该是大型文件集的最佳解决方案,但是您需要2个额外的tmp文件(已排序的文件)*)
*)在bash中,您可以使用&lt;&lt;&lt;&lt;&lt;&lt;避免使用tmp文件。

如果find给出的路径是相对路径,并且Master_File_RMB_To_AFBS.lst中的文件是完整路径,那么下面的解决方案就可以工作。

通过输出命令循环可以完成 for file in $(command); docommand | while read file; do
出于某些原因,我更喜欢最后一种方法:

  • 命令可以返回一个空字符串 虽然没有任何东西在管道中,但这里没有任何问题。 for将导致不完整的行。
  • 我学会了从左到右阅读,管道感觉很自然。
  • 读取完整的行 for会破坏空格的输入(或你的IFS所说的)
  • 虽然可以在单词/不同的vars中分割输入行 这里没有使用,就像while read field1 f2 f3 f_others

在循环内部,使用find命令找到的$文件,您需要使用Master_File_RMB_To_AFBS.lst检查文件。您只需要知道是否找到该文件。我不使用grep -q,所有grep都不支持。所以我使用计数选项-c。
myAction是关于你在问题循环中写的所有内容。 当你想要它的功能时,你必须选择函数如何知道$文件。只需将其拾取(将其用作全局变量),但首选技术将其作为参数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