NextCloud 同步出现 “Cannot sync due to invalid modification time” 问题解决
今天在使用客户端同步 NextCloud 文件的时候,出现了 「Cannot sync due to invalid modification time」 的错误,强制重新同步也无法解决。
联想到前段时间总有同事反馈 NextCloud 文件无法同步的问题,当时以为是文件冲突引起的。现在看来,极有可能是文件本身的修改时间真出问题了。
而文件修改时间无法识别,这个问题比较少见,文件的修改时间和文件的格式及内容无关,即使文件内容或格式出错,也不会造成修改时间无法识别的问题。唯一能造成文件修改时间无法识别的,那极有可能是修改时间超出了系统识别范围,这又扯到计算机元年的问题上去了。
什么是计算机元年?上古时期的计算机操作系统是32位,一个 int 类型的数据是32位,它表示的范围是:-2147483648 ~ 2147483647,用它来代表秒钟数进行计算:2147483647/(365x24x60x60)=68.1 (年) 也就是说用这个数来表示时间如果从公元纪年(耶稣诞生)开始算显然不够用,所以综合当时 UNIX 的发展历程,取了1970年1月1日0时0分0秒做为计算机元年 ,用于计时的开始。
所以,如果计算机无法识别文件的修改时间,那极有可能这个修改时间在1970年1月1日0时0分0秒这个时间之前。
秉着这个思路,到服务器进行查询时,果然发现了问题:
[root@cdc_ncapp html]# find . -type f -name "*" -newermt 1970-01-01 ! -newermt 1970-01-02 | wc -l
375
由于各地的时区不同,所以我查询了时间区间在 1970-01-01
到 1970-01-02
的文件,居然有375个。。。
通过以下命令核实,这些文件确实存在时间上的问题,如图:
[root@cdc_ncapp html]# find . -type f -name "*" -newermt 1970-01-01 ! -newermt 1970-01-02 -print0 | xargs -0 ls -l
虽然不是很明白这些问题是怎么出现的,有可能是本地客户端上传时时间不对,也有可能是某次升级导致。不过既然找到了问题,要解决就比较简单了,那就是将这些文件的修改时间,改成计算机能识别的时间。通过以下命令,可以批量将文件的修改时间改成当前时间:
[root@cdc_ncapp html]# find . -type f -name "*" -newermt 1970-01-01 ! -newermt 1970-01-02 -print0 | xargs -0 touch -m
修改完成后,再次执行查询命令,发现问题文件已经没有了:
[root@cdc_ncapp html]# find . -type f -name "*" -newermt 1970-01-01 ! -newermt 1970-01-02 | wc -l
0
处理完成后,在电脑客户端重复同步几次,发现问题……依然有部分没解决。。。😓
通过分析发现,有几个文件通过以上条件无法找到,需要变更一下条件,至于 why,我是弄不太懂,求大神详解:
[root@cdc_ncapp html]# find . -type f -name "*" -newermt 1970-01-01 ! -newermt 1970-01-02 -print
[root@cdc_ncapp html]#
[root@cdc_ncapp html]# find . -type f -name "*" ! -newermt 1970-01-02 -print
./data/huangzz/files/***.docx
./data/huangzz/files/***.docx
[root@cdc_ncapp html]#
[root@cdc_ncapp html]# find . -type f -name "*" ! -newermt 1970-01-02 -print0 | xargs -0 ls -l
-rw-r--r-- 1 33 root 135467 Jan 1 1970 ./data/huangzz/files/***.docx
-rw-r--r-- 1 33 33 135467 Jan 1 1970 ./data/huangzz/files/***.docx
[root@cdc_ncapp html]#
把剩下的文件通过同样的方式处理后,终端同步终于正常……
[root@cdc_ncapp html]# find . -type f -name "*" ! -newermt 1970-01-02 -print | wc -l
2
[root@cdc_ncapp html]# find . -type f -name "*" ! -newermt 1970-01-02 -print0 | xargs -0 touch -m
[root@cdc_ncapp html]# find . -type f -name "*" ! -newermt 1970-01-02 -print | wc -l
0
注意:在执行 touch -m 的时候,必须先 print 一下,看是否有文件,否则可能会出错。文件修复后执行同步时,需要多尝试几次,最好是将本地错误的文件删除后再次尝试。