通过rsync通过inotify识别错误的文件名
问题描述:
我有以下脚本,它使用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
答
你所看到的是一种常见的编程技术。它通常用于程序将用新内容替换现有文件。
假设您有一个名为foo
的文件,您想用新版本替换。您可以打开foo进行写入,这会截断文件,然后将新内容写入文件。但是,假设你的程序崩溃或者没有完成。您再也没有foo
的好副本 - 旧版本不见了,新版本是空的或不完整的。
相反,你的程序步骤如下:
- 打开一个不同名称的文件,说
.foo.tmp
。 - 将新内容写入这个新文件。
- 完成后,将
.foo.tmp
重命名为foo
。
现在,如果你的程序未能完成,那么它会留下一个临时文件.foo.tmp
。但原始文件仍然存在,所以没有丢失。
Rsync默认使用这种技术来更新文件。你的脚本订阅创建事件,所以你看到了临时文件的创建。如果您要订阅移动事件,您可能会看到正在重命名的文件具有正确的名称。
Rsync有一些选项来控制这种行为。 See the man page here并搜索“--inplace”和“--partial”。
谢谢Kenster为您详细解答。正是我需要的。 –