bash - 如果有新文件到达并发送带有文件名的邮件,我想查看目录的更改
问题描述
我创建了一个 bash 脚本来检查目录是否有新的文件更改并将邮件发送给收件人。但我得到了错误。
我创建了一个 bash 脚本,但它抛出了以下错误。
script6.sh:第 10 行:意外标记done'
script6.sh: line 10:
完成附近的语法错误
只是我想知道我错在哪里。总脚本是否错误或有任何小错误。在这方面需要帮助。
#!/bin/bash
targetDir="/somedir"
while true; do
files=("$targetDir"/*)
sleep 1m ## wait 1 minute
files1=("$targetDir"/*)
if [[ ${#files[@]} != ${#files1[@]} ]]; then
mailx -s "New files arrived:$files1" some@mail.com < "$files1"
fi
done
我的任务如下。1.观察传入文件的目录。2.如果有新文件到达,请检查现有文件 3.如果是新文件,请向收件人发送邮件我希望以上所有内容都应通过 bash 脚本实现。
解决方案
我们第一次可以扫描目录并将扫描结果存档。之后,如果有更新、删除或创建新文件或目录。
我们可以使用此基准存档数据进行比较,然后我们可以确定当前目录的内容是否已更新。
我们可以根据您的需要使用文件块大小或 md5。
这是一种更简单的方法,您还可以对其进行更新以使用其他监控方法。
if [ "$#" -ne 1 ]; then
echo "Usage: `basename $0` directoryName"
exit 1
fi
firstTime=0
lastFile=last.txt
recentFile=recent.txt
currentDir=$1
if [ ! -e "$lastFile" ]; then
firstTime=1
fi
shopt -s extglob
cd $currentDir && du -bs !($lastFile|$recentFile) > recent.txt 2> /dev/null
if [ "$firstTime" -ne 1 ]; then
changes=$(sed '1,/@@/d' <(diff -Naur recent.txt last.txt))
if [ -n "$changes" ]; then
echo "Change:"
echo "$changes" | tee $$.tmp
echo
filename=$(awk '/^+/||/^-/{print $2}' $$.tmp | sort -u)
count=0
for f in $filename; do
echo "changed filename: $f"
let "count+=1"
done
echo -e "\nA total of $count filenames were changed."
else
echo "The Directory has no changes.."
fi
else
echo "[First run] Archiving.."
fi
cp $recentFile $lastFile
rm -rf $$.tmp 2> /dev/null
推荐阅读
- video - Webrtc启动解析
- shell - korn shell 数组中的负值问题
- c# - 如何确定两个文件是否硬链接到相同的数据?
- servicenow-rest-api - ServiceNow REST API - 查询表 - 分组条件
- android - 有没有办法在android中显示一个全局Dialog?
- mysql - 无法使用 Laravel 迁移
- javascript - 如何将范围滑块的详细信息保存在本地存储中?
- python - 拆分 Pandas DataFrame,其中一个因子列均匀分布在拆分中
- amazon-web-services - 让我们在 AWS Linux 上加密 certbot
- python - Python json.loads 返回字符串