首页 > 解决方案 > Bash 脚本自动通过电子邮件发送变量文件名和相应的修改日期时间戳

问题描述

简而言之,我正在尝试查找重复文件(已从 FTP 站点下载,它是另一个脚本文件),并通过电子邮件向企业发送有关所有重复文件及其相应修改日期的信息。

该文件/path/test_mail.txt每行包含一个文件名(在本例中为两个文件名),例如。

abc.xlsx
def.xlsx

在下面的代码中,我试图为第一个文件名找到修改后的日期时间戳,并使用相应的文件名对其进行管道传输并发送一封电子邮件,类似地,循环为第二个文件运行。

这是使用统计

for val in '/path/test_mail.txt'; do
        { stat path/$val | grep 'Modify: ' | cut -d' ' -f2,3,4 | awk -F"." '{print $1}' ; } |

        $val

done |


mail -s "Duplicate file found ${DATE}" abc@xyz.com

我还尝试使用 ls -ltr 以另一种方式

for val in '/path/tj_mail.txt'; do
            { ls -ltr /path/$val | cut -d' ' -f6,7,8 | find $val / -path

$val

    done |


    mail -s "Duplicate file found ${DATE}" abc@xyz.com

我期待电子邮件正文应该大约像

重复文件名 - xyz.xlsx 上传时间 - 2020-02-17 11:18:10

重复文件名 - abc.xlsx 上传时间 - 2020-02-17 11:18:10

下面的问题是可选的,但如果你能帮助我,那就太好了!

另外我正在使用另一个脚本来查找目录中的重复文件名。它工作得很好。但我想知道我是否可以将上面相同的代码放入 1 个单个脚本文件中,这样它就会变得简洁明了!

{
DATE=`date +"%Y-%m-%d"`
dirname=/path
tempfile=myTempfileName
find $dirname -type f  > $tempfile
cat $tempfile | sed 's_.*/__' | sort |  uniq -d|
while read fileName
do
 grep "$fileName" $tempfile
done
} | tee '/path/tj_var.txt' | awk -F"/" '{print $NF}'  | tee '/path/tj_var.txt' | sort -u | tee '/path/tj_mail.txt' | mail -s "Duplicate file found ${DATE}" abc@xyz.com

这是我的实际代码

path = /marketsource/SrcFiles/Target_Shellscript_Autodownload/Airtime_Activation
printf "%s" "$(</marketsource/scripts/tj_mail.txt)" | while IFS= read -r filename; do
   mtime=$(stat -c %y "/path/$filename")
   printf 'Duplicate Filename - %s Uploaded time - %s\n' "$filename" "$mtime"
done | mail -s "Duplicate file found ${DATE}" tipalli@allegisgroup.com

 mtime=$(stat -c %y "/path/$filename" 2>/dev/null || echo "unknown (stat failed)")

这是错误!

./tj_mail1.ksh: line 1: path: command not found stat: cannot stat `/path/AirTimeActs_2020-02-08.xlsx': 没有这样的文件或目录

再多一点!!

我的目标是查找任何重复文件,如果没有任何重复文件并且查找命令为空,则执行 if 条件并执行“mv”命令并完全退出脚本,如果它们是重复文件,则退出 if 条件并管道复制文件并执行邮件和日期戳操作。

    {
DATE=`date +"%Y-%m-%d"`
dirname=/marketsource/SrcFiles/Target_Shellscript_Autodownload/Airtime_Activation
tempfile=myTempfileName
find $dirname -type f  > $tempfile
cat $tempfile | sed 's_.*/__' | sort |  uniq -d|
while read fileName
do
 grep "$fileName" $tempfile
done
}
if ["$fileName" == ""]; then
         mv /marketsource/SrcFiles/Target_Shellscript_Autodownload/Airtime_Activation/*.xlsx /marketsource/SrcFiles/Target_Shellscript_Autodownload/Airtime_Activation/Archive

         mv /marketsource/SrcFiles/Target_Shellscript_Autodownload/Airtime_Activation/*.csv /marketsource/SrcFiles/Target_Shellscript_Autodownload/Airtime_Activation/Archive
        exit 1

fi | tee '/marketsource/scripts/tj_var.txt' | awk -F"/" '{print $NF}'  | tee '/marketsource/scripts/tj_var.txt' | sort -u | tee '/marketsource/scripts/tj_mail.txt'



DATE=`date +"%Y-%m-%d"`
printf "%s\n" "$(</marketsource/scripts/tj_mail.txt)" | while IFS= read -r filename; do
   mtime=$(stat -c %y "/marketsource/SrcFiles/Target_Shellscript_Autodownload/Airtime_Activation/$filename")
   printf  'Duplicate Filename - %s Uploaded time - %s\n\n' "$filename" "$mtime"
done | mail -s "Duplicate file found ${DATE}" ti@allegisgroup.com

标签: linuxbashshell

解决方案


我假设该文件/path/test_mail.txt已由其他一些脚本(作为重复文件列表)准备好,任务是添加列出的文件的修改时间/path/test_mail.txt并格式化输出,如问题所示。

while IFS= read -r filename; do
   mtime=$(stat -c %y "/path/$filename") 
   printf 'Duplicate Filename - %s Uploaded time - %s\n' "$filename" "$mtime"
done < "/path/test_mail.txt"

除了解析文件/path/test_mail.txt,您还可以将其添加到这样的管道中

somehow_print_duplicate_file_names | while IFS= read -r filename; do
   mtime=$(stat -c %y "/path/$filename") 
   printf 'Duplicate Filename - %s Uploaded time - %s\n' "$filename" "$mtime"
done | somehow_send_mail

stat如果失败,您可以添加一些错误处理。

   mtime=$(stat -c %y "/path/$filename" 2>/dev/null || echo "unknown (stat failed)")

或使用stat的错误信息

   mtime=$(stat -c %y "/path/$filename" 2>&1)

推荐阅读