如何使用“stat”来检测新文件,然后将其移动到不同的目录?

如何使用“stat”来检测新文件,然后将其移动到不同的目录?

最终,我想检测一个新的备份文件被放入目录中,然后将该新文件移动到另一个位置以进行其他操作。

当没有人登录服务器并且我用来启动操作的脚本将由 crontab 条目触发时,这需要起作用。

我尝试像这样使用“inotifywait”:

dir=/home/userid/drop/
target=/home/userid/current/

inotifywait -m "$dir" --format '%w%f' -e create |
    while read file; do
        mv "$file" "$target"
    done

这只适用于您打开了终端窗口会话。如果您尝试使用 crontab 条目在无人值守的情况下启动此 scipt,则 inotifywait 命令将被忽略。

于是我尝试使用“entr”并发现了同样的问题。仅当您打开终端窗口时它才有效。当我使用 entr 创建脚本并使用 crontab 条目在无人值守的情况下触发它时,它被忽略,就像 inotifywait 示例一样。

所以我知道这可以使用“stat”来完成,并且我已经查看了很多示例并尝试为我的目的找出它们,但我只是不理解它的语法。

我知道 stat 可以检测目录中是否存在新文件,但我不知道如何处理该结果以触发 mv (移动)命令的执行以将新文件移动到不同的位置。

一旦我有了可以做到这一点的统计语法,我将需要它永久运行。也许它只每 15 秒检查一次或什么的,但我需要它始终准备好移动文件。

如果有人有这样做的经验,并且可以帮助我使用链接 stat 来执行另一个命令的语法,我将不胜感激。我真的相信其他人也想知道如何做到这一点,因为我无法想象每个人都可以为其他 2 个解决方案保持 ssh putty 窗口 24/7 打开。

提前致谢。

巴克曼

答案1

所有你需要的是incronincron如果您有 Ubuntu/Debian,请先安装软件包:

sudo apt install incron

或使用 Red Hat/Fedora 命令:

sudo yum install incron

在您最喜欢的文本编辑器中打开文件/etc/incron.allow- 让它成为vim

vim /etc/incron.allow

并添加带有您的用户名的新行(假设是bob)以允许他使用incron

bob

然后打开incron规则编辑器:

incrontab -e

并添加以下行:

/home/userid/drop/ IN_CREATE mv /home/userid/drop/$# /home/userid/current/

其中$#incron内置通配符,表示 检测到的新删除的备份文件的名称incron

要测试创建的规则,请将文件添加到/home/userid/drop/目录并检查删除的文件是否已移动到/home/userid/current/目录。另外检查系统日志:

tail /var/log/syslog

答案2

定期cron作业是不合适的,因为它们只是偶尔运行,而对 inode 更改做出反应的进程必须始终运行。@reboot启动一个(希望)永远运行的进程的作业就足够了。

$ crontab -l
@reboot /home/jhqdoe/job
$ cat job
#!/bin/sh
dir=/home/jhqdoe/drop/
target=/home/jhqdoe/current/
inotifywait -m "$dir" --format '%w%f' -e create \
| while read file; do mv -- "$file" "$target"; done
$ sudo reboot

如果可能的话,由 init 系统管理的启动守护进程可能是更好的选择,因为如果作业由于多种原因失败,这些守护进程更容易重新启动。

相关内容