USBドライブにコピーされたファイルのタイムスタンプ


13

PCまたはラップトップからUSBドライブにコピーされたファイルのタイムスタンプに問題があります。元のファイルとコピーされたファイルの最終変更時刻が異なります。したがって、PCと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上のファイルの方が新しいことが示されています(そうではありません)。

状況は、ファイルの最終変更時刻がPCとラップトップ異なって表示されるという事実によってさらに複雑になります。違いは正確に2時間ですが、日付と時刻の設定はPCとラップトップで同じです。

さらに詳しい情報

上記のとおり、私のPCとラップトップの両方が動作を示しています。PCにUbuntu 14.04.5(信頼できる)があり、ラップトップにUbuntu 16.04.2(xenial)があります。

USBドライブにはvfatファイルシステムがあります。mount | grep CORSAIR 私のPCの出力は

/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でもvfatファイルシステムを使用できるように、USBドライブにvfatファイルシステムを保持したいと思います。


USBドライブに別のファイルシステム(Linux ext4ファイルシステムなど)を作成しますか?(Microsoft独自のファイルシステム、FAT32、exFAT、NTFSのLinuxでのサポートにはいくつかの制限があります。)Microsoft独自のファイルシステムの代替としてだけでなく、このリンクを参照してください。ext4udf
sudodus

回答:


17

タイムスタンプの秒数の変更に関する問題は、VFAT(はい、FAT32でも)ファイルシステムが2秒の解像度で変更時間を保存するという事実から生じます。

どうやら、ファイルシステムがマウントされている限り、ファイルシステムドライバーは1秒の精度のタイムスタンプをキャッシュします(おそらくPOSIX要件を満たすため)が、ファイルシステムがアンマウントされると、キャッシュはクリアされ、実際に記録されているものが表示されますファイルシステムディレクトリ。

PCとラップトップの2時間の違いは、おそらくVFATファイルシステムのタイムゾーン設定やデフォルトのマウントオプションが異なるためです。(現在、UTCオフセットが正または負の2時間であるタイムゾーンにいると推測しています。)

内部的に、LinuxはUnixスタイルのファイルシステムでUTCタイムスタンプを使用します。ただし、VFATファイルシステムでは、(現在の)デフォルトはVFATファイルシステムのタイムスタンプでローカル時間を使用することです。これはMS-DOSが行ったものであり、Windowsはまだ行っているためです。ただし、これに影響する2つのマウントオプションがありますtz=UTC。VFATファイルシステムでUTCベースのタイムスタンプを使用するマウントオプションをtime_offset=<minutes>指定するか、この特定のファイルシステムで使用するタイムゾーンオフセットを明示的に指定することができます。

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


ご回答ありがとうございます。私の質問mount | grep CORSAIRはラップトップの出力で完了しましたが、これは実際のPCの出力とは異なります。また、あなたは正しいです。私は中央ヨーロッパのCEST(= UTC + 2)タイムゾーンにいます。
K.ガボール

これらのマウント出力には、タイムスタンプに影響するマウントオプションが含まれていないようです。したがって、VFATタイムスタンプのデフォルトの処理は、Ubuntuのバージョン間のカーネルレベルで変更されている必要があります。どうやら最近のUSBドライブのエントリを書き込む場合udisks/etc/fstab、で指定されたマウントオプションを考慮する必要があります。
telcoM

0

vfatUSBドライブにファイルシステムを保持したい」と質問に書きましたが、最後にntfsファイルシステムに再フォーマットしました。LinuxとWindowsの両方が処理できntfs、上記のタイムスタンプで奇妙な現象を示さないようです。


はい、NTFSはすべてのファイルのタイムスタンプをUTC時間に基づく64ビット数として保存するため、解像度は100ナノ秒で、日付範囲は1601年1月1日から60056年5月28日までです。これで十分です。さらに重要なことは、VFATファイルシステムにあるような時間帯のあいまいさのような場所がないことです。
telcoM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.