Box.com云的davfs安装时rsync mkstemp失败无效参数(22)


10

根据这些说明,我使用davfs安装了Box.com云存储。我将Box.com帐户安装在/ home / me / Cloud / Box下

我可以通过Dolphin以及通过终端访问已挂载的文件系统。这有点慢,但是我可以列出(ls)并浏览整个目录结构,而不会出现错误。

接下来,我尝试如下运行rsync:

rsync -auvz  --max-size=250M --exclude '.*' /home/me/Music/ /home/me/Cloud/Box/Music

我也尝试过:

rsync -auv  /home/me/Music/A /home/me/Cloud/Box/Music

和rsync命令的其他变体。该命令是通过davfs挂载将我的音乐从本地文件系统(/ home / me / Music /)复制到Box云(/ home / me / Cloud / Box / Music)。

我总是会收到很多这种形式的错误:

rsync: mkstemp <filename> failed: Invalid argument (22)

一个具体的例子是:

rsync: mkstemp "/home/me/Cloud/Box/Music/VariousArtists/.01_Track_1.mp3.YVmFI9" failed: Invalid argument (22)

这一切都是在Kubuntu 12.04 LTS 64位服务器级硬件上进行的,具有快速/可靠的电缆调制解调器连接(12 Mb / s的上传速度)。

Answers:


7

发生问题是由于rsync使用box.com和/或davfs无法理解的文件名制作了临时文件。因此,文件.01_Track_1.mp3.YVmFI9没有您的系统上存在,但是是暂时的假象rsync。我这边有些猜测:如果您没有在所有文件上都得到该错误,则可能只会得到已经上载(并已更改)的文件上的错误。

曾经是不可能关掉这个临时文件生成,但你可以通过添加选项现在有更多的运气--inplace。但是,如果您不与rsync-daemon进行对话,则使用rsync的优势(如果您不是在使用davfs,则不是),这对我来说尚不清楚。

因此,您可以尝试使用cp --update,仅在源比目标时才复制文件。新文件以及ID3标签更改的任何文件都将被复制,其他文件则不会被复制。

或者,如果您需要更多控件使用find

cd /home/me/Music/
find * -size -250M -print0 | cpio -pdmv0 /home/me/Cloud/Box/Music

这样可以保留层次结构,cpio并且不会覆盖不旧的现有文件。


1
使用rsync的原因之一是,我已经知道如何将其限制为复制小于250MB的文件以及未隐藏的文件或目录。我用--max-size=250M --exclude '.*' 。我确定cp可以做到这一点...也许可以通过将find的输出传递给cp来实现?但是我还不知道该怎么做。如果我们提出解决方案,我会尝试cp -ru。谢谢
MountainX

在那种情况下,您根本不需要cp -u,请使用cpio(请参阅更新的答案)
Anthon 2013年

谢谢。我相信这会为我解决。您在此过程中对我进行了教育,非常感谢。(仅供参考,对于我来说,我希望文件小于250MB,不大于。)
MountainX

这样做是... -size -250M可以的,否则您将使用+250M(这里曾经有一个错误的版本,但是我在修改修复之前就意识到了)
Anthon 2013年

3

1.文件名中带有特殊字符的问题

文件名中是否有特殊字符?根据您要写入这些文件的文件系统,例如,它们可能不允许您在文件前加上点(.)。

2. rsync修改时间和webdav2的问题

我碰到了此博客文章,其中描述了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

同一篇文章显示了一种解决方法:

$ rsync -avhP --size-only --bwlimit=64 2012/08 /mnt/box/bwca/

这是可以使用的好方法rsync,但是它只是根据文件的大小而不是校验和来比较文件。

3. davfs2(WebDAV)的问题

我遇到了标题为:通过davfs2进行rsync的线程在sourceforge上的WebDAV(davfs)论坛中。有人在询问类似的情况,他们想使用WebDAV挂载在线存储提供程序,并通过WebDAV对已挂载的存储执行rsync。这就是WebDAV开发人员之一(Werner Baumann)关于这个话题的

维尔纳回应摘录

  • davfs2将仅上传完整的文件。它不能执行rsync通常所做的增量工作,这使rsync非常高效。

  • davfs2使用磁盘上的本地缓存。这将使其响应速度更快,您的应用程序也应从中受益。但是为此需要本地磁盘空间。您应该考虑到较大的缓存大小,以便rsync可以使用本地缓存来完成其大部分工作,并且当rsync已经完成时,davfs2将在后台上载大多数文件。

Werner继续提出以下建议

在这种情况下,这可能是不利的。当rsync读取远程主机上的文件时,必须先由davfs2将其传输到本地缓存中(如果尚不存在)。这可能会使该过程真正且不必要地变慢。由于rsync在您的情况下只能作为复杂的复制程序,因此最好使用cp代替。cp有一个选项(-u)仅复制比davfs2文件系统(= smartdrive)中的文件新的文件,并且它不需要读取文件,而仅读取文件元数据(如mtime)。

诸如“ cp -pru directory / to / backup dav /”之类的命令可以完成此任务。它不下载文件(就像rsync一样,但是我不确定)(请查看cp和rsync的手册)。

选项?

因此,正如@Anthon所建议的那样,您可以使用该cp -u方法来复制文件。意识到此方法仅将文件的大小作为比较因素,因此它并不完全可靠。

比较文件时,您不应使用任何只看修改时间的东西cp -pruWerner解释了为什么在此线程中

摘录与国防部时间

当您卸载davfs2文件系统并在以后稍后再次安装时,文件时间可能已根据来自服务器的时间信息而更改。诸如cp -pu和rsync之类的工具无法依靠这些时间来确定哪些文件已更改。

因此,鉴于围绕修改时间的各种问题,使用纯校验和的方法似乎更合适:

$ rsync -avvz --omit-dir-times --checksum --human-readable --progress <local dir> <remote dir>

你好 文件名中没有特殊字符。我在磁盘上的文件名只是“ 01_Track_1.mp3”。点前缀不是普通文件名的一部分,也不是扩展名(例如.mp3.YVmFI9)。另请注意,并非每个文件都会失败。失败似乎没有规律。
2013年

这是足够的信息吗?got file_sum recv_files(Some_Music_[1999]/Some_Music_[1999]Zuni_SongVarious_Artists24.mp3) rsync: mkstemp "/home/me/Cloud/Box/Music/Some_Music_[1999]/.Some_Music_[1999]Zuni_SongVarious_Artists24.mp3.1aWWRY" failed: Invalid argument (22) got file_sum
MountainX

另一个示例:got file_sum recv_files(Carlos/Dance/05-Tapestry-Carlos.mp3) rsync: mkstemp "/home/me/Cloud/Box/Music/Carlos/Dance/.05-Tapestry-Carlos.mp3.WeGbGS" failed: Invalid argument (22) got file_sum recv_files(Carlos/Dance/06-Dance-Turquoise_Dance-Carlos.mp3)
MountainX

@MountainX-看看我的更新是否是您的问题。另外,rsync您使用的是哪个版本?rsync --version
slm

rsync version 3.0.9 protocol version 30我现在正在测试您更新的解决方案。谢谢!
2013年

3

要停止该Invalid argument (22)错误,我必须停止rsync在davfs目标上创建其临时文件。

rsync --temp-dir=/tmp

我认为发生的情况是rsync的临时文件名开头,.而davfs不允许这样做。所以我走得更远,告诉rsync忽略名称以开头的源文件.。由于使用--delete,我还告诉它不要尝试删除lost+founddavfs目标中的目录。

rsync --temp-dir=/tmp --exclude lost+found --exclude '.*'

我在Cygwin上遇到了这个问题,这个问题是搜索引擎中排名最高的。接受的答案对我不起作用,因为我正在通过Internet进行远程文件同步,因此必须使用rsync。这个答案中的--temp-dir建议是我的解决方案。
nickcrabtree
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.