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


42

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

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

コマンドは次のようになりますが、すべてのファイルは「最新」とマークされます。

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

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

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

ありがとう


ファイルが同一であることがわかっている場合、必要な日付/時刻のスタンプを取得するためにファイルをコピーしないようにするにはどうしてですか?
ティム

3
@ティム:多分多くのデータあります。
リチャード

回答:


75

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

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

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

rsync -vrt --size-only /src /dest

2
また--existing、新しいファイルの偶発的なコピーを防ぐために追加することをお勧めします。
-leden

1
フラグ--archive(または-a)が含まれ-r-tより:)
ドール

6

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


3

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

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

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

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

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

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


ありがとう。現時点ではおそらくRsyncを使い続けると思いますが、将来的に役立つ可能性があるため、間違いなくWebにアクセスしてスクリプトのさまざまなコンポーネントを学習します。
アルテラ

それがまさに私の解決策のようです!音楽ライブラリにメタデータを追加しながら、時間を保存したいです。ただし、明らかにファイル名のスペースを処理することはできません):
Burcardo

2

ソース(例/path/to/source)ディレクトリをtouchコマンドの参照として使用します。ただ、cdあなたのターゲット・ディレクトリとDO

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

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

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


コピーする時間が必要だったので、これは私にとって便利でした。私はそれがctimeをコピーしないことに気付きました。
snapfractalpop

「タッチ」のマンページを読むだけです。このコマンドでatimeとmtimeの両方を設定できます。
knorke

はい、使用できますtouch -arが、それでもctimeは変わりません。それはめったに望まれないと思います。
snapfractalpop

ああ、今は問題が見えます。ありがとう。はい、ctimeを変更するのは難しく、その理由はわかりません。
-knorke

1

確かに、一方からタイムスタンプを読み取り、タッチを使用して他方の同じファイルに設定するスクリプトを作成できます。

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


おかげで、私はrsyncのこの機能を知りませんでした(ウィキペディアでも説明されています)。
アルテラ

0

ファイル変更し、元のタイムスタンプを保持することを希望する私のような人々(たとえば、音楽ライブラリのメタタグを更新する)。

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

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

    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

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


ファイル名のバックスラッシュに関する(一部の)問題を回避するには、を使用しますread -r line。まあ、常に使用read-rます。また、job.sh各ファイルを開くことを避けることができます。コマンドの最後にリダイレクトを配置しますwhile read -r path; do echo touch -a -d $path ; done < /tmp/times > job.sh
。– hagello

2番目の警告:このスクリプトは、ディレクトリのタイムスタンプを転送しません。(まあ、OPはそれを要求しませんでした。)
hagello

0

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


-1

rsyncマニュアル:man rsynca -t-Nswitchをリストします。それらはいじる価値があるかもしれません。


見えませんでした-N。とにかくこれらをお勧めしますか?
トムヘイル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.