如何只存档今天的文件
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); do
与
command | 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
我有一个脚本,它从列表文件中获取文件列表并使用 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); do
与
command | 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