通过rsync发送文件时,通过inotify标识的文件名错误

时间:2015-11-03 16:45:17

标签: bash rsync inotify

我有以下脚本使用inotify来检测文件夹内的更改。如您所见,我保存整个路径以及变量VAR下潜在新文件的名称。 VAR就像我在评论中的字符串一样。当我从另一个文件夹中粘贴一些东西时一切正常但是当通过rsync传输文件时,VAR就像这样/是/ / path / .filename.log.JgHKzP意味着在前面添加了一个句号文件名和.XXXXXX添加在它的后面。例如我得到了这个

/home/user/CarMonitor/logs/gps/.gps-2015-11-3-18-7-41.log.QvPgm9

我的意思是我可以做一些字符串更改并使其正确但为什么会发生这种情况?提前谢谢。

#!/bin/bash
inotifywait -r -m /home/user/CarMonitor/logs -e create |        #Wait till new files arrive (Flags: -m for 'monitor', -e for 'event')
while read path action file; do
    #echo "The file '$file' appeared in directory '$path' via '$action'"    
    VAR=$path$file  
    #VAR="asddas/sd/f/sda/gps/sdfsdfsdfsd.log"  
    echo $VAR                                               
    //Do stuff
done

1 个答案:

答案 0 :(得分:2)

您所看到的是一种常见的编程技术。它通常在程序要用新内容替换现有文件时使用。

假设您有一个名为foo的文件要用新版本替换。您可以打开foo进行写入,这会截断文件,然后将新内容写入文件。但假设您的程序崩溃或无法完成。您不再拥有foo的良好副本 - 旧版本已消失,新版本为空或不完整。

相反,您的程序遵循以下步骤:

  1. 打开一个名称不同的文件,例如.foo.tmp
  2. 将新内容写入此新文件。
  3. 完成后,将.foo.tmp重命名为foo
  4. 现在,如果您的程序未能完成,那么它将留下一个临时文件.foo.tmp。但原始文件仍然存在,所以没有丢失。

    默认情况下,Rsync使用此技术更新文件。您的脚本订阅了创建事件,因此您可以看到临时文件的创建。如果您要订阅移动事件,您可能会看到正在重命名的文件具有正确的名称。

    Rsync有一些控制此行为的选项。 See the man page here并搜索" - inplace"和" - 部分"。