通过 rsync 发送文件时 inotify 识别出错误的文件名

Wrong filename identified by inotify when file sent via rsync

我有以下脚本,它使用 inotify 检测文件夹内的更改。如您所见,我将整个路径加上可能的新文件的名称保存在变量 VAR 下。 VAR 将类似于我在评论中的字符串。当我从另一个文件夹粘贴内容时,一切正常,但是当文件通过 rsync 传输到那里时,VAR 类似于 this/is/the/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

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

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

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

  1. 打开一个不同名称的文件,比如 .foo.tmp
  2. 将新内容写入此新文件。
  3. 完成后,将 .foo.tmp 重命名为 foo

现在,如果您的程序无法完成,它会留下一个临时文件 .foo.tmp。但是原始文件还在,所以没有丢失任何东西。

Rsync 默认使用这种技术来更新文件。您的脚本订阅了创建事件,因此您看到了临时文件的创建。如果您要订阅移动事件,您可能会看到文件被重命名为正确的名称。

Rsync 有一些选项可以控制这种行为。 See the man page here 并搜索“--inplace”和“--partial”。