如何只存档今天的文件

How to Archive only todays file

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

已编辑:添加说明(在评论中要求)

在午夜使用 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,您可以 select 不到一天的文件。这不是解决方案,它会回顾 24 小时。
触摸后 /tmp/archive_date.tmp 将从最后一个午夜开始。使用查找,您可以查找比给定文件更新的文件。该查找将显示今天的文件。我加了-type f,我们对目录不感兴趣。

在您的代码中,您使用 Master_File_RMB_To_AFBS.lst 来处理 'whitelist' 个文件。现在您有 2 个列表,查找输出和您的 'whitelist'。我认为您只需要两个文件中都存在的文件。
当首先对两个文件进行排序时,可以使用 common -12 查找在 2 个文件中共享的行。使用 sort + common 应该是大型文件集的最佳解决方案,但您需要 2 个额外的 tmp 文件(排序后的文件)*)
*) 在 bash 中,您可以使用带有 <<< 的进程替换来避免 tmp 文件。

当查找给出的路径是相对路径并且 Master_File_RMB_To_AFBS.lst 中的文件是完整路径时,下面的解决方案也有效。

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

  • 命令可以return一个空字符串 while 不会在管道中放任何东西,这里没有任何问题。 for 将导致行不完整。
  • 我学会了从左到右阅读,管道感觉很自然。
  • While 读取整行 for 将打破空格输入(或你的 IFS 所说的)
  • 虽然可以将输入行拆分为单词/不同的变量 此处未使用,类似于 while read field1 f2 f3 f_others

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