我有一个脚本,它从列表文件中获取文件列表,并使用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命令查找文件日期,但我无法找到完美的动态解决方案,请帮忙。
答案 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); do
与
command | while read file; do
出于某些原因,我更喜欢最后一种方法:
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