【发布时间】:2020-03-03 23:37:41
【问题描述】:
我的目标是通过比较同一目录中的所有文件名(abc.xyz,def.csv)来查找任何重复的文件名。如果没有任何重复的文件名,则将上述文件路径中的所有这些文件(.csv、.xlsx)移动到存档路径中。
如果存在重复文件名,则仅获取这些重复文件名的名称及其修改日期时间戳,并向团队发送通知电子邮件,并将剩余的非重复文件名移至存档文件夹。
如您所见,我正在尝试通过以下代码来实现它。
如果 find 命令为空,则执行 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@gmail.com
【问题讨论】:
-
你好@Bodo 请在上面找到我的问题。
-
在同一个目录下不可能有两个同名的文件。
-
将您的脚本粘贴到shellcheck.net 并修复它告诉您的所有内容。我相信还有一些关于管道如何工作的基本误解。
-
抱歉我的错......它的 .xlsx 和 .csv 扩展名
-
对我来说,仍然不清楚你在问什么。你没有描述你期望发生的事情和实际发生的事情;你应该尽可能地缩短你的脚本,同时保留相关的行为(见minimal reproducible example)。