通过 rsync 发送文件时 inotify 识别的文件名错误
Posted
技术标签:
【中文标题】通过 rsync 发送文件时 inotify 识别的文件名错误【英文标题】:Wrong filename identified by inotify when file sent via rsync 【发布时间】:2015-11-03 16:45:17 【问题描述】:我有以下脚本,它使用 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
【问题讨论】:
【参考方案1】:您看到的是一种常见的编程技术。它通常在程序要用新内容替换现有文件时使用。
假设您有一个名为 foo
的文件,您想用新版本替换它。您可以打开 foo 进行写入,这会截断文件,然后将新内容写入文件。但是假设您的程序崩溃或无法完成。你已经没有foo
的好副本了——旧版本没有了,新版本是空的或不完整的。
相反,您的程序遵循以下步骤:
-
打开一个具有不同名称的文件,例如
.foo.tmp
。
将新内容写入此新文件。
完成后,将.foo.tmp
重命名为foo
。
现在,如果您的程序未能完成,那么它将留下一个临时文件.foo.tmp
。但是原始文件仍然存在,因此没有丢失任何内容。
Rsync 默认使用这种技术来更新文件。您的脚本订阅了创建事件,因此您看到了临时文件的创建。如果您要订阅移动事件,您可能会看到文件被重命名为正确的名称。
Rsync 有一些选项可以控制这种行为。 See the man page here 并搜索“--inplace”和“--partial”。
【讨论】:
感谢 Kenster 的详尽回答。正是我需要的。以上是关于通过 rsync 发送文件时 inotify 识别的文件名错误的主要内容,如果未能解决你的问题,请参考以下文章