Bash 我想观察一个目录的变化,如果新文件到达并发送一封带有文件名的邮件

Bash 我想观察一个目录的变化,如果新文件到达并发送一封带有文件名的邮件,bash,shell,Bash,Shell,我创建了一个bash脚本来检查目录中的新文件更改,并将邮件发送给收件人。 但是我得到了错误 我创建了一个bash脚本,但它抛出了以下错误 script6.sh:第10行:意外标记附近的语法错误done' script6.sh:第10行:done' 我只是想知道我错在哪里。 整个脚本是否错误或是否存在任何小错误。 我需要帮助 #!/bin/bash targetDir="/somedir" while true; do files=("$targetDir"/*) sleep 1m ## wai

我创建了一个bash脚本来检查目录中的新文件更改,并将邮件发送给收件人。 但是我得到了错误

我创建了一个bash脚本,但它抛出了以下错误

script6.sh:第10行:意外标记附近的语法错误
done'
script6.sh:第10行:
done'

我只是想知道我错在哪里。 整个脚本是否错误或是否存在任何小错误。 我需要帮助

#!/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
#/bin/bash
targetDir=“/somedir”
虽然真实;做
文件=(“$targetDir”/*)
睡1米##等1分钟
files1=(“$targetDir”/*)
如果[${文件[@]}!=${文件1[@]}]];然后
mailx-s“新文件到达:$files1”some@mail.com<“$files1”
fi
完成
我的任务如下。 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
if[“$#”-ne 1];然后
echo“用法:`basename$0`directoryName”
出口1
fi
第一次=0
lastFile=last.txt
recentFile=recent.txt
currentDir=$1
如果[!-e“$lastFile”];然后
第一次=1
fi
shopt-s extglob
cd$currentDir&&du-bs!($lastFile |$recentFile)>recent.txt 2>/dev/null
如果[“$firstTime”-ne 1];然后
更改=$(sed'1,/@@/d'/dev/null)

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

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

我们可以根据需要使用文件块大小或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
如果[“$#”-ne 1];则
echo“用法:`basename$0`directoryName”
出口1
fi
第一次=0
lastFile=last.txt
recentFile=recent.txt
currentDir=$1
如果[!-e“$lastFile”];则
第一次=1
fi
shopt-s extglob
cd$currentDir&&du-bs!($lastFile |$recentFile)>recent.txt 2>/dev/null
如果[“$firstTime”-ne 1];则
更改=$(sed'1,/@@/d'/dev/null)

只是想让您了解您还可以做什么:

#!/bin/bash
targetDir="22"
inotifywait -q -r -m -e create "$targetDir" |
while read -r path event filename; do
  mailx -s "New files arrived: $path$filename" some@mail.com < "$path$filename"
done
!/bin/bash
targetDir=“22”
inotifywait-q-r-m-e创建“$targetDir”|
读取时-r路径事件文件名;执行
mailx-s“新文件到达:$path$filename”some@mail.com<“$path$filename”
完成

不过,您需要在系统上安装inotifywait,请通过安装“inotify工具”进行安装。

只是为了让您了解您还可以做什么:

#!/bin/bash
targetDir="22"
inotifywait -q -r -m -e create "$targetDir" |
while read -r path event filename; do
  mailx -s "New files arrived: $path$filename" some@mail.com < "$path$filename"
done
!/bin/bash
targetDir=“22”
inotifywait-q-r-m-e创建“$targetDir”|
读取时-r路径事件文件名;执行
mailx-s“新文件到达:$path$filename”some@mail.com<“$path$filename”
完成

不过,您需要在系统上安装inotifywait,请通过安装“inotify工具”进行安装。

您可以使用为文件监视程序特制的inotifywait

#!/bin/bash
targetDir="/somedir"
inotifywait -m $targetDir -e create -e moved_to |
    while read path action file; do
        mailx -s "Filers arrived:$files" some@mail.com < "$files"
        # do something with the file
    done
!/bin/bash
targetDir=“/somedir”
inotifywait-m$targetDir-e create-e移动到|
读取路径操作文件时;执行以下操作
mailx-s“文件服务器到达:$files”some@mail.com<“$files”
#对这个文件做些什么
完成

您可以使用inotifywait,它是专为文件监视程序设计的

#!/bin/bash
targetDir="/somedir"
inotifywait -m $targetDir -e create -e moved_to |
    while read path action file; do
        mailx -s "Filers arrived:$files" some@mail.com < "$files"
        # do something with the file
    done
!/bin/bash
targetDir=“/somedir”
inotifywait-m$targetDir-e create-e移动到|
读取路径操作文件时;执行以下操作
mailx-s“文件服务器到达:$files”some@mail.com<“$files”
#对这个文件做些什么
完成

如果使用linux,请查看
inotify工具
包提供的实用程序。如果使用linux,请查看
inotify工具
包提供的实用程序。