【问题标题】:Monitor directory for changes without 3rd party packages在没有 3rd 方包的情况下监视目录的更改
【发布时间】:2013-01-04 16:48:02
【问题描述】:

许多其他问题都是关于 StackOverflow 的。我没有找到任何结果不使用任何 3rd 方包的地方。

问题是我正在使用 Hetzner,他们希望允许我安装任何软件包。

我可以使用 PHP、Python、Java(几乎是标准集合)

如何监视目录(递归)中的新文件并将引用获取到另一个文件中。

我尝试过这样的事情:

while true; do
    last=`cat log.txt`
    find "$UPLOAD_FOLDER"'/.' -type f > 'log.txt'
    now=`cat log.txt`

    diff -n <(echo "$last") <(echo "$now") >> 'queue.txt'

    sleep 60;
done;

但它不可靠,它会污染queue.txtd3ab5a 等。

【问题讨论】:

  • 你能用什么? Python?克朗?等等?
  • @AlG 我可以使用 PHP、Python、Java(几乎是标准集合)

标签: linux bash shell unix ubuntu


【解决方案1】:

可能最简单的方法是使用标记文件:

touch markerFile
while true
do
    find "$UPLOAD_FOLDER"'/.' -type f -newer markerFile >> 'queue.txt'
    touch markerFile
    sleep 60
done

查找和触​​摸之间可能存在轻微的竞争条件?

cmets 中建议的更复杂的双缓冲解决方案:

touch markerFileA
touch markerFileB
while true
do
    touch markerFileB
    find "$UPLOAD_FOLDER"'/.' -type f -newer markerFileA ! -newer markerFileB >> 'queue.txt'
    sleep 60
    touch markerFileA
    find "$UPLOAD_FOLDER"'/.' -type f -newer markerFileB ! -newer markerFileA >> 'queue.txt'
    sleep 60
done

【讨论】:

  • 您可以通过在查找之前存储当前时间然后使用 touch -t 来将误报换成误报
  • @cmh:另一种方法是在两个标记文件之间交替,沿着双缓冲线。触摸一个;找到 -newer b ! -新时代;睡觉;触摸 b;找到-新的! -较新的b;睡觉
【解决方案2】:

您可以使用sed 删除不需要的输出:

while :; do

    find "$UPLOAD_FOLDER/." -type f > "log1.txt"

    if [ -f "log2.txt" ]; then
        diff log1.txt log2.txt | sed '/^[^<]/d;s/^< //'

        fi

    mv "log1.txt" "log2.txt"

    sleep 60

done

【讨论】:

  • 问题是我无法安装任何软件包... :(
  • @NULL 签出我的updated answer,我对其进行了修改以在不安装软件包的情况下获得所需的输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
相关资源
最近更新 更多