复制到 USB 驱动器的文件的时间戳

复制到 USB 驱动器的文件的时间戳

我对从 PC 或笔记本电脑复制到 USB 驱动器的文件的时间戳有问题:原始文件的最后修改时间和复制文件的最后修改时间不同。因此,在我的电脑和 USB 驱动器之间同步文件非常麻烦。

一步一步的描述

  1. 我使用 GUI 或命令将任意文件从 PC/笔记本电脑复制到 USB 驱动器

    cp -a file.txt /media/gabor/CORSAIR/
    
  2. 我检查原始文件的最后修改时间:

    $ ls -l --time-style=full-iso file.txt
    -rw-rw-r-- 1 gabor gabor 0 2018-09-22 15:09:23.317098281 +0200 file.txt
    
  3. 我检查复制文件的最后修改时间:

    $ ls -l --time-style=full-iso /media/gabor/CORSAIR/file.txt
    -rw-r--r-- 1 gabor gabor 0 2018-09-22 15:09:23.000000000 +0200 /media/gabor/CORSAIR/file.txt
    
  4. 正如您所看到的,复制文件的最后修改时间中的秒数被截断为零十进制数字。但是,如果我输入命令

    if ! [ file.txt -nt /media/gabor/CORSAIR/file.txt ] && ! [ file.txt -ot /media/gabor/CORSAIR/file.txt ]; then echo "The last modification times are equal."; fi
    

我得到输出The last modification times are equal.

  1. 如果我卸载并重新安装 USB 驱动器并再次执行最后两个命令,情况就会发生变化:

    $ ls -l --time-style=full-iso /media/gabor/CORSAIR/file.txt
    -rw-r--r-- 1 gabor gabor 0 2018-09-22 15:09:22.000000000 +0200 /media/gabor/CORSAIR/file.txt
    $ if [ file.txt -nt /media/gabor/CORSAIR/file.txt ]; then echo "The file is newer on the PC."; fi
    The file is newer on the PC.
    
  2. 因此,重新挂载后,复制文件的最后修改时间会进一步减少一秒。但是,进一步卸载和重新挂载不会再影响最后修改时间。此外,对文件的测试现在显示 PC 上的文件较新(尽管事实并非如此)。

由于显示了文件的最后修改时间,情况变得更加复杂在我的电脑和笔记本电脑上有所不同,尽管我的 PC 和笔记本电脑上的日期和时间设置相同,但相差正好 2 小时!

更多信息

我的电脑和笔记本电脑都显示了上述行为。我的 PC 上有 Ubuntu 14.04.5 (trusty),笔记本电脑上有 Ubuntu 16.04.2 (xenial)。

我的 USB 驱动器有 vfat 文件系统。的输出mount | grep CORSAIR 在我的电脑上

/dev/sdb1 on /media/gabor/CORSAIR type vfat (rw,nosuid,nodev,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec,flush,uhelper=udisks2)

的输出mount | grep CORSAIR 在我的笔记本电脑上

/dev/sdb1 on /media/gabor/CORSAIR type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2)

我的其他 USB 驱动器也显示出相同的行为。

问题

能否以某种方式消除上次修改时间的差异?例如,在安装/卸载时使用其他参数?或者这是 Ubuntu 中的一个错误?

我希望实现原始文件和复制文件的时间戳完全相同,这样可以更有效地进行同步。另外,我想将 vfat 文件系统保留在我的 USB 驱动器上,以便我也可以在 Windows 下使用它们。

答案1

时间戳秒数变化的问题来自于 VFAT(是的,甚至是 FAT32)文件系统仅以 2 秒分辨率存储修改时间。

显然,只要文件系统被挂载,文件系统驱动程序就会缓存精确到 1 秒分辨率的时间戳(可能是为了满足 POSIX 要求),但是一旦文件系统被卸载,缓存就会被清除,您将看到文件系统目录中实际记录的内容。

PC 和笔记本电脑之间的两个小时差异可能是由于不同的时区设置和/或 VFAT 文件系统的默认安装选项不同造成的。 (我猜测您所在的时区当前 UTC 偏移量为 2 小时,无论是正数还是负数。)

在内部,Linux 在 Unix 风格的文件系统上使用 UTC 时间戳;但在 VFAT 文件系统上,(当前)默认设置是在 VFAT 文件系统时间戳上使用本地时间,因为 MS-DOS 就是这样做的,Windows 仍然这样做。但有两个挂载选项可能会影响这一点:您可以指定挂载选项tz=UTC以在 VFAT 文件系统上使用基于 UTC 的时间戳,或者可以用于time_offset=<minutes>显式指定要用于此特定文件系统的时区偏移量。

Ubuntu 14.04 和 16.04 之间的 VFAT 默认挂载选项可能在内核或udisks可移动媒体帮助程序服务中发生了变化,导致您看到两个小时的差异。

答案2

尽管我在问题中写道“我想将vfat文件系统保留在我的USB驱动器上”,但最终我将它们重新格式化为ntfs文件系统。 Linux 和 Windows 都可以处理ntfs,并且似乎没有显示出上面描述的带有时间戳的奇怪现象。

相关内容