有没有为什么要创建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这样的其他邮件读取器。
检查不使用ls
或find
的新文件的另一种方法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