web-dev-qa-db-ja.com

Rsync:タイムスタンプのみをコピーする

現在、タイムスタンプを除いて、すべての点で同一の2つのディレクトリA /とB /があります。したがって、コマンドを実行すると:

rsync --dry-run -crvv A/ B/

次に、すべてのファイルに「最新」のマークが付けられますが、コマンド:

rsync --dry-run -rvv A/ B/

は、すべてのファイルがA /からB /にコピーされることを示しています。

私の質問はこれです:ファイルが(内容に関して)同一であることを知っていれば、B /のファイルのタイムスタンプをにファイルのタイムスタンプと同じになるように設定する方法があります(rsyncまたはその他) A /、すべてのファイルをA /からB /にコピーせずに?

ありがとう

44
artella

-t(タイムスタンプを保持)と--size-onlyを使用すると、ファイルのサイズのみが比較されます。サイズが一致する場合、rsyncはファイルをコピーしませんが、-tが指定されているため、宛先ファイルのタイムスタンプを再コピーせずに更新します。

-u(更新)は使用しないでください。既存のファイルはスキップされ、タイムスタンプの更新は完全にスキップされます。

最初はrsyncを使用して一連のファイルを新しいドライブにコピーしないという問題があったため、タイムスタンプが現在の時刻に更新されました。以下のコマンドを使用して、適切な時間内にすべてを正しく同期しました。

rsync -vrt --size-only /src /dest
76
Grant Pannell

--size-onlyを使用すると、サイズが一致する場合、rsyncはファイルのタイムスタンプ(したがってファイルの内容)の比較をスキップします。これを--timesと組み合わせると、タイムスタンプがターゲットツリー全体に複製されます。

6
user115916

私はrsyncがこれを行うのに適切なツールだと思いますが、スクリプトでこれを実行したい場合は、何かを開始するよりも良いスタートを切ることができます。

次のようなタイムスタンプ(アクセス時間)を含むファイルリストを取得できます。

find . -printf '"%p" %a\n' -type f > /tmp/times

そして、そこから適切な時間更新コマンドを取得します。

 while read line; do echo touch -a -d \"${line#* }\" ${line%% *}; done < /tmp/times

完全なスクリプトではありませんが、良い開始点です!:)

3
Stone

source(例:/path/to/source)ディレクトリをtouchコマンドのリファレンスとして使用します。 targetディレクトリにcdして、

find -type f -exec touch -r /path/to/source/{} {} \;

Rsyncで1秒未満のタイムスタンプをコピーすることはできません(まだ)。

これはディレクトリと疑似ファイルでも機能します(-type fを削除または変更するだけです)

2
knorke

確かに、片側からタイムスタンプを読み取り、タッチを使用して反対側の同じファイルにタイムスタンプを設定するスクリプトを書くこともできます。

ただし、rsyncですべてのファイルをコピーするよりも、はるかに時間がかかる可能性があります。実際に転送されるデータはほとんどありません(ファイルが完全に同一である場合は、ブロックハッシュのみ)。ただし、すべてのファイルの完全な内容は、少なくとも両側で読み取る必要があります。したがって、ディスクの帯域幅またはIOPSによって制限されているため、時間がかかる場合があります。しかし、それでも、スクリプトを作成してテストするよりも時間は短いでしょう。

1
rmalayter

ファイルを変更して元のタイムスタンプを保持したい(たとえば、音楽ライブラリのメタタグを更新したい).

Stoneが提供するソリューションに基づいています。ただし、ここでは変更時間とタイムスタンプを復元するための作業スクリプトについて説明します。最初にステップ1を実行してから、ファイルの操作を開始します。

  1. 古いタイムスタンプを保持。現在のディレクトリから操作し、すべての隠しファイルを除外して、/tmp/filesの一時ファイルに保存します。パラメータはいつでも変更できますが、後のtouchコマンドがそれを利用するため、-printf '"%t" "%p"\n'を使用することをお勧めします。

    find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files

  2. ファイルを変更好きなだけ

  3. タイムスタンプの復元に役立つファイルを作成します。

    while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times

  4. そして最後に、変更されたファイルに古い日付を適用します

    sh job.sh

警告:名前の間隔、特殊文字を含むファイルで機能しますが、たとえば$サインインを含むファイルはありません。

0
Burcardo

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

0
Pierre

Rsyncマニュアル:man rsyncには-tおよび-Nスイッチがリストされています。

0
Tim