Bash shell 脚本在没有 Inotify 的情况下收到新文件时获取电子邮件

Rea*_*ook 3 bash shell sh

有什么理由创建 Bash shell 脚本,将所有新传入的文件信息(文件名;到达日期/时间;文件大小)发送到某个文件夹。

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

Gra*_*eme 6

就像是:

#!/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 '%Tc\t%s\t%p\n' |
    mail -s "incoming" "$email"

  files="$newfiles"
done
Run Code Online (Sandbox Code Playgroud)

只要创建的文件中没有包含名称中的换行符,这应该可以正常工作。其他警告是我看不到任何find输出人类可读大小的选项,因此需要进一步处理。此外,大多数文件系统实际上并不存储文件创建时间,而是使用修改时间(在这种情况下它并没有真正的区别)。

更新

要测试脚本并将其打印到终端,只需删除前一行末尾的mail行和管道 ( |)。我把监控目录改成了最上面的一个变量,而不是直接编码,所以在这里填写目录。然后将脚本放入一个文件中,设置可执行权限并运行(./filename当在脚本目录中时)。如果您将文件放入您的目录中,它们应该会在几秒钟后出现在脚本的控制台上。

要发送电子邮件,您需要确保您的系统设置为从命令行发送电子邮件。你的发行版应该有这方面的说明。您可以发送带有以下内容的测试电子邮件:

<<<hello mail -s "test email" some@email.com
Run Code Online (Sandbox Code Playgroud)

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