Mou*_*inX 14 ubuntu rsync dropbox cloud davfs2
我根据这些说明使用 davfs 安装了 Box.com 云存储。我在 /home/me/Cloud/Box 下安装了我的 Box.com 帐户
我可以通过 Dolphin 和终端访问挂载的文件系统。它有点慢,但我可以列出 (ls) 并在没有错误的情况下浏览整个目录结构。
接下来,我尝试按如下方式运行 rsync:
rsync -auvz --max-size=250M --exclude '.*' /home/me/Music/ /home/me/Cloud/Box/Music
Run Code Online (Sandbox Code Playgroud)
我也试过:
rsync -auv /home/me/Music/A /home/me/Cloud/Box/Music
Run Code Online (Sandbox Code Playgroud)
以及 rsync 命令的其他变体。该命令是通过 davfs 挂载将我的音乐从我的本地文件系统 (/home/me/Music/) 复制到 Box 云 (/home/me/Cloud/Box/Music)。
我总是收到很多这种形式的错误:
rsync: mkstemp <filename> failed: Invalid argument (22)
Run Code Online (Sandbox Code Playgroud)
一个具体的例子是:
rsync: mkstemp "/home/me/Cloud/Box/Music/VariousArtists/.01_Track_1.mp3.YVmFI9" failed: Invalid argument (22)
Run Code Online (Sandbox Code Playgroud)
这一切都发生在 Kubuntu 12.04 LTS 64 位服务器级硬件上,具有快速/可靠的电缆调制解调器连接(12 Mb/s 上传速度)。
出现此问题是因为rsync
使用 box.com 和/或 davfs 不理解的文件名制作临时文件。因此,文件.01_Track_1.mp3.YVmFI9
没有您的系统上存在,但是是暂时的假象中rsync
。我的一些猜测:如果您没有在所有文件上收到错误,您可能只会在已经上传(和更改)的文件上收到错误。
它曾经是不可能关掉这个临时文件生成,但你可以通过添加选项现在有更多的运气--inplace
。但是,如果您不与 rsync-daemon 交谈(如果您使用 davfs 则不是),使用 rsync 的优势我不清楚。
因此,作为替代方案,您可以尝试cp --update
,它仅在源比目标新时才复制文件。新文件和 ID3 标签更改的任何文件都将被复制,其他文件则不会。
或者,如果您需要更多控制使用find
:
cd /home/me/Music/
find * -size -250M -print0 | cpio -pdmv0 /home/me/Cloud/Box/Music
Run Code Online (Sandbox Code Playgroud)
这保留了层次结构并且cpio
不会覆盖不旧的现有文件。
文件名中是否有任何特殊字符?根据您将这些文件写入到的文件系统,例如,它们可能不允许您使用点 ( .
) 作为文件前缀。
我遇到了这篇博客文章,其中描述了rsync
一个问题,即跨 webdav2 安装的 box.com 目录写入/跟踪文件修改时间时出现问题。
问题在挂载的文件系统中显示如下:
david@sydney:~/Pictures$ ls -l /mnt/box/bwca/08/09/IMG_3084.CR2
-rw-r--r-- 1 david david 12564061 Aug 14 16:08 /mnt/box/bwca/08/09/IMG_3084.CR2
david@sydney:~/Pictures$ ls -l 2012/08/09/IMG_3084.CR2
-rw-rw-r-- 1 david david 12564061 Aug 9 13:00 2012/08/09/IMG_3084.CR2
Run Code Online (Sandbox Code Playgroud)
同一篇文章展示了一种解决方法:
$ rsync -avhP --size-only --bwlimit=64 2012/08 /mnt/box/bwca/
Run Code Online (Sandbox Code Playgroud)
这是一个不错的使用方式rsync
,但它现在只是根据文件的大小比较文件,而不是它们的校验和。
我遇到了这个主题为:rsync via davfs2?在 sourceforge 上的 WebDAV (davfs) 论坛中。有人询问了类似的情况,他们想使用 WebDAV 挂载在线存储提供程序并通过 WebDAV 对挂载的存储执行 rsync。这是WebDAV 的一位开发人员 (Werner Baumann) 对这个话题所说的话。
沃纳的回应摘录
davfs2 只会上传完整的文件。它不能做 rsync 通常所做的增量工作,这使得 rsync 非常有效。
davfs2 使用磁盘上的本地缓存。这将使其响应更快,您的应用程序也应该从中受益。但是它需要本地磁盘空间。您应该允许较大的缓存大小,以便 rsync 可以使用本地缓存完成大部分工作,而 davfs2 将在 rsync 完成时在后台上传大部分文件。
Werner 继续提出以下建议
在这种情况下,这可能是一个缺点。当 rsync 读取远程主机上的文件时,必须先由 davfs2 将其传输到本地缓存中(如果尚未存在)。这可能会使该过程真正且不必要地变慢。由于 rsync 在您的情况下仅用作复杂的复制程序,因此最好改用 cp 。cp 有一个选项 (-u) 来仅复制比 davfs2 文件系统(= smartdrive)中的文件更新的文件,它不需要读取文件,而只读取文件元数据,如 mtime。
像“cp -pru directory/to/backup dav/”这样的命令可能会完成这项工作。它不支持下载文件(就像 rsync 可能会这样做,但我不确定)(请查看 cp 和 rsync 的手册)。
因此,正如@Anthon 所建议的,您可以使用该cp -u
方法来复制文件。意识到此方法仅将文件大小视为比较因素,因此并不完全可靠。
在比较文件时,您不应该使用任何只查看修改时间的东西,cp -pru
. Werner 在此线程中解释了原因:
关于模组时间问题的摘录
当您卸载 davfs2 文件系统并在稍后重新安装时,根据来自服务器的时间信息,文件时间可能已更改。cp -pu 和 rsync 等工具不能依赖这些时间来确定哪些文件发生了更改。
因此,考虑到围绕修改时间的各种问题,使用纯校验和的方法似乎更合适:
$ rsync -avvz --omit-dir-times --checksum --human-readable --progress <local dir> <remote dir>
Run Code Online (Sandbox Code Playgroud)
为了停止该Invalid argument (22)
错误,我必须停止 rsync 在 davfs 目标上创建其临时文件。
rsync --temp-dir=/tmp
Run Code Online (Sandbox Code Playgroud)
我认为发生的情况是 rsync 的临时文件名以 开头.
,而 davfs 不允许这样做。所以我更进一步,告诉 rsync 忽略名称以.
. 由于我使用的是--delete
,我还告诉它不要尝试删除lost+found
davfs 目标中的目录。
rsync --temp-dir=/tmp --exclude lost+found --exclude '.*'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
24212 次 |
最近记录: |