bash shell脚本将在新文件无侵犯的情况下获取电子邮件



有没有为什么要创建bash shell脚本,这些bash shell脚本将所有新的传入文件信息(文件名;到达日期/时间;文件;文件; filesize)转到某些文件夹。

我不能使用innotify,所以请不要将其视为选项。

类似:

#!/bin/bash
monitor_dir=/path/to/dir
email=me@me.com
files=$(find "$monitor_dir" -maxdepth 1 | sort)
IFS=$'n'
while true
do
  sleep 5s
  newfiles=$(find "$monitor_dir" -maxdepth 1 | sort)
  added=$(comm -13 <(echo "$files") <(echo "$newfiles"))
  [ "$added" != "" ] &&
    find $added -maxdepth 1 -printf '%Tct%st%pn' |
    mail -s "incoming" "$email"
  files="$newfiles"
done

只要没有创建的文件中包含名称中的新线的文件,这应该效果很好。其他警告是,我看不到find输出人类可读大小的任何选择,因此获得需要进一步处理的选择。同样,大多数文件系统实际上并未存储文件创建时间,而是使用修改时间(并不是说在这种情况下它有任何真正的不同)。

更新

要测试脚本并将其打印到终端,只需在上一行的末端删除mail行和管道(|)即可。我将监视器目录更改为顶部的变量,而不是直接编码,因此请在此处填写目录。然后将脚本放入文件中,设置可执行权限并运行(在脚本目录中时./filename)。如果将文件放入目录中,则它们应在几秒钟后出现在脚本的控制台上。

要发送电子邮件,您需要确保设置系统以从命令行发送电子邮件。您的发行版应该有说明。您可以发送:

发送测试电子邮件
<<<hello mail -s "test email" some@email.com

如果您不想设置发送电子邮件,也可以通过username@localhost通过电子邮件发送本地系统用户。您可以使用mail命令进行检查,也可以设置像Thunderbird这样的其他邮件读取器。

检查不使用lsfind的新文件的另一种方法bash inceldins。

更优雅的解决方案只有在您的收件箱不受监控的情况下才能起作用(即邮件进来,写入文件,没有人读取它):

#!/bin/bash
inbox_dir=/path/to/dir
while true; do
    for f in "$inbox_dir"/*; do
        [ -N "$f" ] && {
            head -1 "$f" >/dev/null
            echo "unread stuff in file: $f"
        }
    done
    sleep 5
done

另一个解决方案,该解决方案在访问邮件文件时也可以使用时间戳:

#!/bin/bash
stamp=/tmp/email_monitor.stamp
inbox_dir=/path/to/dir
touch "$stamp"
while true; do
    mv "$stamp" "$stamp.old"
    touch "$stamp"
    for f in "$inbox_dir"/*; do
        [ "$f" -nt "$stamp.old" -a "$f" -ot "$stamp" ] && {
            echo "new stuff in file: $f"
        }
    done
    rm -f "$stamp.old"
    sleep 5
done

相关内容

  • 没有找到相关文章

最新更新