現在、タイムスタンプを除いて、すべての点で同一の2つのディレクトリA /とB /があります。したがって、コマンドを実行すると:
rsync --dry-run -crvv A/ B/
次に、すべてのファイルに「最新」のマークが付けられますが、コマンド:
rsync --dry-run -rvv A/ B/
は、すべてのファイルがA /からB /にコピーされることを示しています。
私の質問はこれです:ファイルが(内容に関して)同一であることを知っていれば、B /のファイルのタイムスタンプをにファイルのタイムスタンプと同じになるように設定する方法があります(rsyncまたはその他) A /、すべてのファイルをA /からB /にコピーせずに?
ありがとう
-t
(タイムスタンプを保持)と--size-only
を使用すると、ファイルのサイズのみが比較されます。サイズが一致する場合、rsyncはファイルをコピーしませんが、-t
が指定されているため、宛先ファイルのタイムスタンプを再コピーせずに更新します。
-u
(更新)は使用しないでください。既存のファイルはスキップされ、タイムスタンプの更新は完全にスキップされます。
最初はrsyncを使用して一連のファイルを新しいドライブにコピーしないという問題があったため、タイムスタンプが現在の時刻に更新されました。以下のコマンドを使用して、適切な時間内にすべてを正しく同期しました。
rsync -vrt --size-only /src /dest
--size-onlyを使用すると、サイズが一致する場合、rsyncはファイルのタイムスタンプ(したがってファイルの内容)の比較をスキップします。これを--timesと組み合わせると、タイムスタンプがターゲットツリー全体に複製されます。
私はrsyncがこれを行うのに適切なツールだと思いますが、スクリプトでこれを実行したい場合は、何かを開始するよりも良いスタートを切ることができます。
次のようなタイムスタンプ(アクセス時間)を含むファイルリストを取得できます。
find . -printf '"%p" %a\n' -type f > /tmp/times
そして、そこから適切な時間更新コマンドを取得します。
while read line; do echo touch -a -d \"${line#* }\" ${line%% *}; done < /tmp/times
完全なスクリプトではありませんが、良い開始点です!:)
source(例:/path/to/source
)ディレクトリをtouchコマンドのリファレンスとして使用します。 targetディレクトリにcd
して、
find -type f -exec touch -r /path/to/source/{} {} \;
Rsyncで1秒未満のタイムスタンプをコピーすることはできません(まだ)。
これはディレクトリと疑似ファイルでも機能します(-type f
を削除または変更するだけです)
確かに、片側からタイムスタンプを読み取り、タッチを使用して反対側の同じファイルにタイムスタンプを設定するスクリプトを書くこともできます。
ただし、rsyncですべてのファイルをコピーするよりも、はるかに時間がかかる可能性があります。実際に転送されるデータはほとんどありません(ファイルが完全に同一である場合は、ブロックハッシュのみ)。ただし、すべてのファイルの完全な内容は、少なくとも両側で読み取る必要があります。したがって、ディスクの帯域幅またはIOPSによって制限されているため、時間がかかる場合があります。しかし、それでも、スクリプトを作成してテストするよりも時間は短いでしょう。
ファイルを変更して元のタイムスタンプを保持したい(たとえば、音楽ライブラリのメタタグを更新したい).
Stoneが提供するソリューションに基づいています。ただし、ここでは変更時間とタイムスタンプを復元するための作業スクリプトについて説明します。最初にステップ1を実行してから、ファイルの操作を開始します。
古いタイムスタンプを保持。現在のディレクトリから操作し、すべての隠しファイルを除外して、/tmp/files
の一時ファイルに保存します。パラメータはいつでも変更できますが、後のtouch
コマンドがそれを利用するため、-printf '"%t" "%p"\n'
を使用することをお勧めします。
find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files
ファイルを変更好きなだけ
タイムスタンプの復元に役立つファイルを作成します。
while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times
そして最後に、変更されたファイルに古い日付を適用します
sh job.sh
警告:名前の間隔、特殊文字を含むファイルで機能しますが、たとえば$
サインインを含むファイルはありません。
Windowsでタイムスタンプのみをコピーする最良の方法:
ファイルの最後に作成/変更/アクセスされたタイムスタンプを別のファイルにコピーするには、次を使用できます。
touch/c/m/a/r SourceFile DestFile
(このバージョンのTouchはWin32コンソールツールボックスの一部です http://www.stevemiller.net/apps/ )
Robocopy "SOURCE_DIRECTORY" "DESTINATION_DIRECTORY"/E/COPYALL/DCOPY:DAT/XF。/ R:10/W:5/V/ETA
Rsyncマニュアル:man rsync
には-t
および-N
スイッチがリストされています。