我如何监视目录中的新文件,如果每 30 分钟没有添加文件则删除邮件?

我如何监视目录中的新文件,如果每 30 分钟没有添加文件则删除邮件?

我正在运行 Ubuntu 14.04,我想监视一个文件夹,如果每 30 分钟没有添加新文件,则发送一封邮件。

我也在下面提到过。

如何监视目录中的新文件并将其移动/重命名到另一个目录?

我不确定如何等待一段时间并检查文件夹中的新文件。

答案1

您也许可以做一些简单的事情,例如:

#!/bin/bash
targetDir="$1"
while true; do
  files=("$targetDir"/*)
  sleep 30m ## wait 30 minutes
  files1=("$targetDir/"*)
  if [[ ${#files[@]} == ${#files1[@]} ]]; then
     echo "No new files added" | mail [email protected]
  fi
done

将该脚本另存为~/bin/watch.sh或任何你喜欢的内容,使其成为可执行文件(chmod a+x ~/bin/watch.sh)并运行它,并将目标目录作为参数:

watch.sh /path/to/dir

现在,这是一种非常简单的方法,只是每 30 分钟计算一次文件数量。因此,如果删除了一个文件但添加了另一个文件,它会认为没有新文件。取最新文件的时间戳并检查它是否在 30 分钟前最后一次修改可能是一个更好的主意:

#!/bin/bash
targetDir="$1"
newest=0;

while true; do
  ## Wait for half an hour. This is done at the beginning of the loop
  ## to ensure we wait a half hour before the first check
  sleep 30m
  ## Get the current time in seconds since the epoch
  now=$(date '+%s')
  for file in "$targetDir"/*; do
    ## Get the file's modification time in seconds since the epoch
    lastMod=$(stat -c "%Y" "$file")
    ## Is this file newer than the current newest?
    if [[ $lastMod -gt $newest ]]; then
      newest=$lastMod
    fi
  done
  ## If the newest file is older than half an hour
  if [[ $((now - newest)) -gt 1800 ]]; then
    echo "No new files added since $(date -d '- 30 min')" |
      mail [email protected]
  fi
done

如果您不想一直运行这样的脚本,那么您可以编写一个检查时间戳的脚本,并每 30 分钟调用一次该脚本:

#!/bin/bash
targetDir="$1"
newest=0;

for file in "$targetDir"/*; do
  ## Get the file's modification time in seconds since the epoch
  lastMod=$(stat -c "%Y" "$file")
  ## Is this file newer than the current newest?
  if [[ $lastMod -gt $newest ]]; then
    newest=$lastMod
  fi
done
## Get the current time in seconds since the epoch
now=$(date '+%s')
## If the newest file is older than half an hour
if [[ $((now - newest)) -gt 1800 ]]; then
    echo "No new files added since $(date -d '- 30 min')" |
     mail [email protected]
fi

现在,将其另存为~/bin/watch.sh并使其可执行(chmod a+x ~/bin/watch.sh)。然后,运行crontab -e并添加此行:

*/30 * * * * /home/techie/bin/watch.sh

保存文件(保存会添加 crontab)就大功告成了。脚本将每 30 分钟运行一次。

答案2

在检查新文件之前,我会在目录本身上使用“stat”并查看时间戳是否改变。

$ stat $PWD
  File: ‘/home/paulm/SCRATCH’
  Size: 6144        Blocks: 8          IO Block: 32768  directory
Device: 26h/38d Inode: 10937103831396301849  Links: 6
Access: (0775/drwxrwxr-x)  Uid: (  520/   paulm)   Gid: ( 1020/   paulm)
Access: 2019-07-09 13:17:15.528000000 +0000
Modify: 2019-07-09 13:17:15.528000000 +0000
Change: 2019-07-09 13:17:15.528000000 +0000
 Birth: -

$ touch bar

$ stat $PWD
  File: ‘/home/paulm/SCRATCH’
  Size: 6144        Blocks: 8          IO Block: 32768  directory
Device: 26h/38d Inode: 10937103831396301849  Links: 6
Access: (0775/drwxrwxr-x)  Uid: (  520/   paulm)   Gid: ( 1020/   paulm)
Access: 2019-07-09 13:23:11.346000000 +0000
Modify: 2019-07-09 13:23:11.346000000 +0000
Change: 2019-07-09 13:23:11.346000000 +0000
 Birth: -

如果目录中的日期发生变化,那么就值得寻找新文件,这应该更加高效。

答案3

到目前为止,答案都假设文件只会进入目录,而不会出去。但是,如果您有一个定期清空目录的脚本,该怎么办?那么脚本可能会错过文件 5 分钟前进入目录但已被处理并取出的事实。

另一个选择是使用inotifywait用高效 C 语言编写的命令,用于监控文件和目录的创建和修改。您可以使用以下命令安装它:

sudo apt install inotify-tools

伪代码合适的脚本如下:

  • 等待 30 分钟或直到目录更改
  • 目录有改变吗?
  • 是吗?我们到达这里是因为目录已更改。返回并再次等待 30 分钟。
  • 没有?我们来这里是因为 30 分钟已到。发送电子邮件并返回再等待 30 分钟。

您可以从类似的地方调用该脚本,/etc/rc.local以便它在机器启动时运行。

这种方法的优点是您不是每 30 分钟检查一次目录,而是在目录最后一次更改后 30 分钟检查一次。

答案4

有一个实用工具可以完成这个任务:

https://github.com/eradman/entr

相关内容