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ドライブをアンマウントしてから再度マウントし、最後の2つのコマンドを再実行すると、状況が変わります。

    $ 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. したがって、再マウント後、コピーされたファイルの最後の変更時間はさらに1秒短縮されます。ただし、追加のアンマウントと再マウントは、もはや最後の修正時間には影響しません。また、ファイルテストでは、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のバグですか?

同期をより効率的に実行できるように、元のファイルとコピーされたファイルのタイムスタンプがまったく同じになるようにしたいと思います。また、Windowsでも使用できるように、USBドライブにvfatファイルシステムを保存したいと思います。

答え1

タイムスタンプ秒の変更の問題は、VFAT(FAT32など)ファイルシステムが修正時間を2秒の解像度でのみ保存するという事実に由来します。

明らかに、ファイルシステムドライバはファイルシステムがマウントされている間(おそらくPOSIXの要件を満たすために)正確な1秒の解像度でタイムスタンプをキャッシュしますが、ファイルシステムがアンマウントされるとキャッシュが消去され、ファイルシステムに実際に書き込まれた内容見ることができます。礼拝の規則。

PCとラップトップの2時間の違いは、タイムゾーンの設定やVFATファイルシステムのデフォルトのインストールオプションが異なるために発生する可能性があります。 (あなたのタイムゾーンの現在のUTCオフセットは正であれ負であれ、2時間のようです。)

内部的に、LinuxはUnixスタイルのファイルシステムでUTCタイムスタンプを使用しますが、VFATファイルシステムでは(現在)デフォルトはVFATファイルシステムタイムスタンプでローカルタイムを使用することです。これはMS-DOS方式であり、Windowsではまだそうするからです。ただし、これに影響を与える可能性がある2つのマウントオプションがあります。tz=UTCVFATファイルシステムでUTCベースのタイムスタンプを使用するようにマウントオプションを指定するか、それを使用してこの特定のファイルtime_offset=<minutes>システム数量に使用するタイムゾーンオフセットを明示的に指定できます。

Ubuntu 14.04と16.04の間のVFATデフォルトのマウントオプションがudisksカーネルまたはリムーバブルメディアヘルパーサービスで変更され、2時間の違いが発生する可能性があります。

答え2

vfat「USBドライブにファイルシステムを維持したい」という質問に書きましたが、結局ファイルシステムに再ntfsフォーマットするようになりました。 LinuxとWindowsの両方がこの問題に対処し、ntfs上記のタイムスタンプで奇妙な動作を示していないようです。

関連情報