web-dev-qa-db-ja.com

コピーまたはrsyncコマンド

次のコマンドは期待どおりに機能しています...

cp -ur /home/abc/* /mnt/windowsabc/

Rsyncには利点がありますか? 24時間ごとに同期してバックアップフォルダーを維持するより良い方法はありますか?

71
shantanuo

Rsyncは、ファイル全体ではなく、更新されたファイルの更新された部分のみをコピーするため、優れています。必要に応じて、圧縮と暗号化も使用します。これを確認してください tutorial

53
marchica

rsyncは、実行するファイルとブロックのより詳細なインベントリのため、必ずしも効率的ではありません。アルゴリズムはその機能に優れていますが、実際に最適な選択になるかどうかを知るには、問題を理解する必要があります。

ファイルは追加されるが更新されない傾向がある非常に大きなファイルシステム(数千または数百万のファイルなど)では、「cp -u」の方が効率的です。 cpは、メタデータのみをコピーすることを決定し、単純にコピーの業務を開始できます。

いくつかのバッファリングが必要な場合があることに注意してください。ファイルのサイズ、ネットワークパフォーマンス、その他のディスクアクティビティなどに応じて、ストレートcpではなくtarを使用します。次のアイデアは非常に便利です。

tar cf - . | tar xCf directory -

メタデータ自体は、実際には非常に大きな(クラスター)ファイルシステムではかなりのオーバーヘッドになる可能性がありますが、rsyncとcpはこの問題を共有します。

rsyncは頻繁に推奨されるツールであるように思われます(また、汎用アプリケーションでは私の通常のデフォルトの選択です)が、rsyncを考え抜かずに盲目的に使用する人が多いでしょう。

52
ckg

作成されたコマンドは、現在の日付とタイムスタンプ、および所有者としての新しいディレクトリとファイルを作成します。あなたがあなたのシステムで唯一のユーザーであり、あなたが毎日これをしているならば、それは大した問題ではないかもしれません。ただし、これらの属性を保持することが重要な場合は、コマンドを次のように変更できます。

cp -pur /home/abc/* /mnt/windowsabc/

-pは、ファイルの所有権、タイムスタンプ、およびモードを保持します。これは、バックアップ対象によっては非常に重要になる場合があります。

Rsyncを使用した代替コマンドは次のようになります

rsync -avh /home/abc/* /mnt/windowsabc

Rsyncでは、-aは上記のすべての属性を保持する「アーカイブ」を示します。 -vは、「verbose」を示します。これは、実行時に各ファイルで何をしているかをリストするだけです。 -zはローカルコピー用には省略されていますが、圧縮用であり、ネットワーク経由でバックアップする場合に役立ちます。最後に、-hはrsyncにMB、GBなどの人間が読める形式でサイズを報告するように指示します。

好奇心から、システムをプライムし、最初の実行に対するバイアスを避けるために1つのコピーを実行し、内部SSDドライブからUSB接続HDDへの1GBのファイルのテスト実行で次の時間を計りました。これらは単に空のターゲットディレクトリにコピーされます。

cp -pur    : 19.5 seconds
rsync -ah  : 19.6 seconds
rsync -azh : 61.5 seconds

両方のコマンドはほぼ同じように見えますが、帯域幅がボトルネックになっていないシステムでは、明らかに圧縮と解凍によって負荷がかかります。

14
mightypile

特に、BTRFSやZFSのようなコピーオンライトファイルシステムを使用する場合、rsyncの方がはるかに優れています。

BTRFSを使用していますが、~/.bashrc

alias cp="rsync -ah --partial --inplace --info=progress2"

BTRFSなどのCoW FSの重要なフラグは--inplaceは、ファイルの変更された部分のみをコピーするため、ファイルiノード間の小さな変更などのために新規に作成しないためです。 this を参照してください。

6
Geremia

ローカルコピーの場合、rsyncの唯一の利点は、ファイルが宛先ディレクトリに既に存在する場合にコピーを回避できることです。 「すでに存在する」の定義は、(a)同じファイル名(b)同じサイズ(c)同じタイムスタンプです。 (たぶん同じ所有者/グループ。私にはわからない...)

「rsyncアルゴリズム」は、低速ネットワークリンクを介したファイルのインクリメンタル更新に最適ですが、ローカルコピーの場合、「差分」計算を実行するために既存の(部分)ファイルを読み取る必要があるため、あまり購入しません。

したがって、この種のコマンドを頻繁に実行しており、変更されたファイルのセットがファイルの総数に比べて小さい場合、rsyncはcpよりも高速であることがわかります。 (rsyncには--deleteオプションが便利だと思います。)

3
Nemo

それは本当に何がより効率的であるかという問題ではありません。

コマンド「rsync」と「cp」は同等ではなく、異なる目標を達成します。

1- rsyncは、既存のファイルの作成時間を保持できます。 (-aオプションを使用)
2- rsyncはマルチプロセスを実行し、ローカルソケットまたはネットワークソケットを使用して転送します。 (つまり、自分自身を複数のプロセスに分岐します)
3-マルチプロセッシングとスレッド化により、多数の小さなファイルをコピーするとき、さらに複数の大きなファイルをコピーするときのスループットが向上します。

つまり、最終的には、rsyncは大きなデータ用であり、cpは小さなローカルコピー用です。 (MBから小GBの範囲)。複数のGBに入るか、TBの範囲内にある場合は、rsyncを使用します。もちろん、ネットワークコピーを使用する場合は、rsyncを使用します。

2
Ellison

ネットワーク転送ではなく、マシンで内部的にファイルを転送している間、-zフラグを使用すると、転送にかかる時間に大きな違いが生じる可能性があることに注意してください。

同じマシン内で転送

Case 1: With -z flag:
    TAR took: 9.48345208168
    Encryption took: 2.79352903366
    CP took = 5.07273387909
    Rsync took = 30.5113282204

Case 2: Without the -z flag:
    TAR took: 10.7535531521
    Encryption took: 3.0386879921
    CP took = 4.85565590858
    Rsync took = 4.94515299797
1

cpを使用している場合、同じ名前のフォルダーをコピーするときに既存のファイルは保存されません。このフォルダーがあるとしましょう:

/myFolder
  someTextFile.txt

/someOtherFolder
  /myFolder
    wellHelloThere.txt

次に、一方を他方にコピーします。

cp /someOtherFolder/myFolder /myFolder

結果:

/myFolder
  wellHelloThere.txt

これは少なくともmacOSで発生することであり、diffファイルを保存したいので、rsyncを使用しました。

0
h3dkandi