2015-11-03 67 views
1

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

/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

你所看到的是一种常见的编程技术。它通常用于程序将用新内容替换现有文件。

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

相反,你的程序步骤如下:

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

现在,如果你的程序未能完成,那么它会留下一个临时文件.foo.tmp。但原始文件仍然存在,所以没有丢失。

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

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

+0

谢谢Kenster为您详细解答。正是我需要的。 –