首页 > 解决方案 > 如果有新文件到达并发送带有文件名的邮件,我想查看目录的更改

问题描述

我创建了一个 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 脚本实现。

标签: bashshell

解决方案


我们第一次可以扫描目录并将扫描结果存档。之后,如果有更新、删除或创建新文件或目录。

我们可以使用此基准存档数据进行比较,然后我们可以确定当前目录的内容是否已更新。

我们可以根据您的需要使用文件块大小或 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

推荐阅读