大きなディレクトリツリーをローカルにコピーしますか?cpまたはrsync?


230

約1.8 TBの大きなディレクトリツリーをコピーする必要があります。それはすべてローカルです。習慣から私は使用したいと思いますがrsync、私は多くのポイントがあるかどうか、そして私がむしろ使用するべきかどうか疑問に思いますcp

コピーで保持する必要があるため、アクセス許可とuid / gidが心配です(rsyncがこれを行うことは知っています)。シンボリックリンクなど。

宛先は空なので、いくつかのファイルを条件付きで更新することを心配する必要はありません。すべてローカルディスクなので、sshやネットワークについて心配する必要はありません。

私がrsyncから離れたくなるのは、rsyncが必要以上のことをするかもしれないからです。rsyncチェックサムファイル。私はそれを必要としません、そして、cpより時間がかかるかもしれないと心配しています。

それで、あなたは何を考慮しますrsynccp


2
rsyncが目的どおりに機能する場合、この特定のアプリケーションの使用法に既に精通しており、好みに応じて十分に機能する場合、なぜ切り替えたいのでしょうか?
eleven81 09

2
rsyncはcpでは実行できない多くのチェックサムを実行するため、rsyncがcpよりも時間がかかることを懸念しているため
Rory

1
チェックサムのCPUオーバーヘッドは、ディスク/ネットワークI / Oと比較して小さいです。ディスクが同じシステム上にあり、OSがバスコントローラーで巧妙なドライブドライブコピーを実行できる場合を除きます。
マーティンベケット

3
チェックサムは、サイズとタイムスタンプのチェックが異なるファイルで実行されます。コピー中の停電後など、あなたが妄想している場合、すべてのファイルでチェックサムを強制することができますが、ローカル転送では、通常はゼロから開始するよりも遅くなります。
コルクマン

3
たぶん彼は彼のワークフローの改善に興味があり、彼はすべてを知っていると考えて頭を砂に埋めません。このコメントは本当に私を困らせます。
マーティンコネクニー

回答:


204

rsyncを使用する理由は、何らかの理由で中断された場合、非常に少ないコストで簡単に再起動できるからです。また、rsyncであるため、大きなファイルを途中で再起動することもできます。他の人が言うように、ファイルを簡単に除外できます。ほとんどのものを保存する最も簡単な方法は、-aフラグ「アーカイブ」を使用することです。そう:

rsync -a source dest

UID / GIDとシンボリックリンクは-a(を参照-lpgo)によって保存されますが、質問は、ファイルシステム情報の完全なコピーが必要なことを意味しています。そして、-aハードリンク、拡張属性、または(Linuxの場合)ACLまたは上記は含まれません(OS X上)リソースフォークをこのように、ファイルシステムの堅牢なコピーのために、あなたはそれらのフラグを含める必要があります:

rsync -aHAX source dest # Linux
rsync -aHE source dest  # OS X

デフォルトのcpが再び開始されますが、-uフラグは「SOURCEファイルが宛先ファイルよりも新しい場合、または宛先ファイルが欠落している場合にのみコピーします」。また、-a(アーカイブ)フラグは再帰的であり、再起動してアクセス許可を保持する必要がある場合はファイルを再コピーしません。そう:

cp -au source dest

5
cpの-uフラグは、部分的にコピー/破損したファイルを検出しないため、おそらく最良のソリューションではありません。rsyncの良いところは、ファイルをmd5 sumして差を検出できることです。
チャドハニーカット2009

3
-w(--whole-file)オプションを追加すると、チェックサムの代わりにファイルをコピーするだけなので、中断されたrsyncの速度が上がります。
hayalci

13
実際、rsyncはローカル転送を検出し、自動的にチェックサムを行わずにファイル全体のコピーを有効にします。
コルクマン

22
そして--progressは本当に便利です!
マット

12
-Pまたは--progressは、各ファイルの進行状況を個別に表示します。多くの(数千の)小さなファイルではなく大きなファイルをコピーするのに役立ちます。これは、読み取ることができない出力が多くなることを意味します。すべてのファイルを組み合わせた全体的な進捗状況は表示されません。
SPRBRN

106

ローカルファイルシステムにコピーするときは、常に次のrsyncオプションを使用します。

# rsync -avhW --no-compress --progress /src/ /dst/

私の理由は次のとおりです。

-a is for archive, which preserves ownership, permissions etc.
-v is for verbose, so I can see what's happening (optional)
-h is for human-readable, so the transfer rate and file sizes are easier to read (optional)
-W is for copying whole files only, without delta-xfer algorithm which should reduce CPU load
--no-compress as there's no lack of bandwidth between local devices
--progress so I can see the progress of large files (optional)

別の回答で示唆されているように、次のtarコマンドで上記のrsync設定を使用すると、転送が17%高速になりました。

# (cd /src; tar cf - .) | (cd /dst; tar xpf -)

1
次のエラーが発生しています:rsync: --no-compress: unknown option@Ellis Percival。
アルパース

これは高速化です。これを行うよりも高速ですrm -rf /src/
dgo

2
@alperと同様に、-no-compressは私のバージョンのrsync(CentOS 7)のオプションではありませんでした。代わりに--compress-level = 0を使用しました。
ポール

79

大量のデータをコピーする必要がある場合、通常はtarとrsyncの組み合わせを使用します。最初のパスは、次のようにtarすることです。

# (cd /src; tar cf - .) | (cd /dst; tar xpf -)

通常、大量のファイルでは、何らかの理由でtarが処理できないものがあります。または、プロセスが中断されるか、ファイルシステムの移行の場合は、実際の移行手順の前に初期コピーを実行することをお勧めします。とにかく、最初のコピーの後、rsyncステップを実行してすべてを同期します。

# cd /dst; rsync -avPHSx --delete /src/ .

末尾のスラッシュ/src/が重要であることに注意してください。


6
+1大きなコピーの場合、rsyncよりもtarの方が一般に高速であることがわかりました。最終的なrsyncで仕上げるというアイデアも気に入っています。
ジェフフリッツ

2
dest dirが空の場合、tarが適切な選択です。私の方法は次のとおりです:cd $ DSTDIR; tar c -C $ SRCDIR | タール
asdmin

19
それがこの方法の美しさです。実際に中間tarファイルを作成することはないため、2倍のスペースは必要ありません。パイプの前のtarはデータをパックしてstdoutにストリーミングし、パイプの後のtarはデータをstdinから取得してアンパックします。
チャドハニーカット

4
12GBの転送ではcp -aを、42GBの転送ではこのメソッドを使用しました。tarメソッドは約1/4の時間を要しました。
NGaida

3
またpv、進行状況を監視できるように中央に配置し、を使用してすべてのデータのサイズを推定しdfます。私はまた、使用され--numeric-owner、ソースディスクを別のシステムからあったように、私はしたくなかったtar所有者を混乱に:tar -C /old-path --numeric-owner -S -c . | pv -tpeba -s 100G | tar -C /new-path --numeric-owner -S -xp
ペトルスキー-パドラック

14

rsync

ここに私が使用しているrsyncがありますが、単純なコマンドにはcpを好みます。

$ rsync -ahSD --ignore-errors --force --delete --stats $SRC/ $DIR/

cpio

さらに安全な方法は、cpioです。これはtarとほぼ同じくらいの速度で、もう少し速いかもしれません。

$ cd $SRC && find . -mount -depth -print0 2>/dev/null | cpio -0admp $DEST &>/dev/null

タール

これも良好で、読み取りエラーが続きます。

$ tar --ignore-failed-read -C $SRC -cf - . | tar --ignore-failed-read -C $DEST -xf -

これらはすべてローカルコピー専用です。


rsyncに-Sおよび-Dフラグを使用するのはなぜですか?
miyalys

7

あなたが好むものは何でも。-aあなたが使うことを決めるときにスイッチを忘れるなcp

本当に答えが必要な場合:rsyncを使用するのは、はるかに柔軟だからです。コピーが完了する前にシャットダウンする必要がありますか?ctrl-cを押して、すぐに再開します。一部のファイルを除外する必要がありますか?使用するだけ--exclude-fromです。所有権または権限を変更する必要がありますか?rsyncがそれを行います。


-pフラグは再び何をしますか?
ロリー

1
Preserverの所有権、タイムスタンプ、および許可が付与されます。
インナ2009

5
cp -aの方が良いでしょう。
デビッドパシュリー

確かに。それに応じて回答が変更されました。
インナ2009

7

このrsyncコマンドは、転送するバイトごとに常にチェックサムを計算します。

コマンドラインオプション--checksumは、ファイルのチェックサムを使用して転送するファイルを決定するかどうかにのみ関係します。

-c, --checksum mod-timeとサイズではなく、チェックサムに基づいてスキップします」

マンページには次のようにも書かれています。

rsyncは、ファイル全体のチェックサムをチェックすることにより、転送された各ファイルが受信側で正しく再構築されたことを常に確認しますが、転送後の自動検証は、このオプションの転送前の「このファイルは必要ですか?」更新しますか?」小切手。

だから、rsyncまた、常に、場合でも、受信側でファイル全体のチェックサムを計算-c/ --checksumオプションが「オフ」です。


14
投稿によって興味深い情報がここに追加されましたが、暴言やin辱によって投稿の価値が下がります。このサイトは、非建設的な暴言のためのフォーラムではありません。ソースを変更できた場合、変更をパッチとして提出しましたか?githubなどにバージョンを投稿しましたか?これについて非常に強く感じている場合、不必要にly辱されるのではなく、もう少し建設的なことをしようとした方が良いかもしれません。
ゾレダチェ

ええ、最後の段落は本当に必要ありませんでした。
シャーウィン

6

rsync -aPhW --protocol=28これらの大きなコピーをRSYNCで高速化するのに役立ちます。90GiBの途中であり、それが壊れているという考えがCPから私を怖がらせるので、私は常にrsyncに行きます


2
そのコマンド文字列で古いプロトコルを使用する価値は何ですか?
ewwhite 09年

1
Macマシンでは、出荷されたRsyncの古いバージョンは、29などの新しいrsyncプロトコルのリビジョンでハングします。古いプロトコルに移動するように指示すると、何度もチェックされなくなります。
oneguynick

28番はもう有効ではないと思いますか?
SPRBRN

5

rsyncは優れていますが、ツリーをメモリに保存するため、非常に大きなディレクトリツリーに問題があります。このスレッドを見つけたときに、彼らがこの問題を修正するかどうかを確認するだけでした。

私も見つけました:

http://matthew.mceachen.us/geek/gigasync/

また、手動でツリーを分割し、複数のrsyncを実行することもできます。


12
バージョン3を使用する場合、ツリーが大きくてもメモリ全体を保持しません。インクリメンタル再帰アルゴリズムを使用します:samba.org/ftp/rsync/src/rsync-3.0.0-NEWS
Kyle Brandt

5

このスレッドは非常に有用であり、結果を達成するためのオプションが非常に多かったため、それらのいくつかをベンチマークすることにしました。私の結果は、他の人がより速く働いたという感覚を持っているのに役立つと信じています。

1,753,200個のファイルに分散された532Gbのデータを移動するには、これらの時間がありました。

  • rsync 232分かかりました
  • tar 206分かかった
  • cpio 225分かかりました
  • rsync + parallel 209分かかった

私の場合、私はを使用することを好みましたrsync + parallel。この情報がより多くの人々がこれらの選択肢の中から決定するのに役立つことを願っています。

完全なベンチマークはここに公開されています


404ページが見つかりません
アメディーヴァンガッセ

1
ありがとう@AmedeeVanGasseのURLは報告してから少し修正されました:)
arjones

ベンチマークしないのはなぜcpですか?これが質問のタイトルです!
カランドア

@calandoa私が思うには、cpすなわち、安全ではない:それはあなたがオーバー開始する必要が壊れたときに、それは私が再開できるオプションを好む方法です、エルゴはrsync私のお気に入りです:)
arjones

3

ローカルディレクトリのローカルコピーを行うとき、私の経験では、「cp -van src dest」はrsyncより20%高速です。再起動可能性に関しては、それが「-n」の機能です。部分的にコピーされたファイルをrmするだけです。ISOなどの場合を除き、苦痛はありません。


2

ARJはとても古い学校です!! ARJやrsyncがパフォーマンスを向上させるとは本当に疑います。

間違いなく私がいつもやっていることはcpioを使うことです:

find . -print | cpio -pdm /target/folder

これはCPよりほぼ高速で、tarよりも確実に高速で、パイプを使用しません。


2
「オリジナルのcpioおよびfindユーティリティは、AT&TのUnixサポートグループで作業中にDick Haightによって作成されました。1977年にPWB / UNIX 1.0で初めて登場しました」-FreeBSDのcpioマニュアルページ。
クリスS

3
cpio残念ながら、ファイルの上限は8GBです。

何もパイプせずに」[原文]。findコマンドを除いて、リストにあるように、パイプがありますfind . -print | cpio -pdm /target/folder
。– warren

1

間違いなくrcloneを試してみてください。このことは非常に速いです:

sudo rclone sync /usr /home/fred/temp -P -L --transfers 64

Transferred:       17.929G / 17.929 GBytes, 100%, 165.692 MBytes/s, ETA 0s
Errors:                75 (retrying may help)
Checks:            691078 / 691078, 100%
Transferred:       345539 / 345539, 100%
Elapsed time:     1m50.8s

これは、LITEONIT LCS-256(256GB)SSDとの間のローカルコピーです。

--ignore-checksum初回実行時に追加して、さらに高速化することができます。



0

tar 仕事もしますが、rsyncのように中断されることから再開しません。


古い答えですが、ファイルの圧縮アーカイブを作成するためのTARではありませんか?rsyncやcpなどのファイルを転送するためにどのように使用できますか?
シャーウィン

@SherwinFlight cd source; tar cf-。| (cd dest; tar xf-)
pgs

0

ARJを使用するとどうなりますか?

arj a -jm -m1 -r -je filepack /source

どこ-jm -m1に圧縮レベルがあり-je、それを実行可能にします。これで、カプセル化されたファイルのbashができました。

次に、ターゲットマップへの抽出用

filepack -y  

ソースマップが作成される場所-y(常に受け入れ、上書き、スキップなど)

次に、可能であれば、ファイルパックをターゲット領域にscp ftpして実行します。


1
アージュ?それは80年代に消滅しませんでしたか?
マイケルハンプトン

ウィキペディアを信じるなら、おそらく90年代前半
マット

0

に適用できる高速化がいくつかありますrsync

避ける

  • -z/ --compress:転送はネットワーク上ではなくRAM上で行われるため、圧縮はCPUのみをロードします。
  • --append-verify:中断された転送を再開します。これは良い考えのように聞こえますが、危険な障害の場合があります。ソースと同じサイズ(またはそれ以上)の宛先ファイルは無視されます。また、最後にファイル全体をチェックサムします--no-whole-file。これは、危険な障害ケースを追加する際に、速度が大幅に向上することを意味します。

つかいます

  • -S/ --sparse:ヌルのシーケンスをスパースブロックに変換します
  • --partialまたは-Pどちらか--partial --progress:将来の再開のために部分的に転送されたファイルを保存します。注:ファイルには一時的な名前がないため、コピー全体が完了するまで、他のユーザーが宛先を使用しないことを確認してください。
  • --no-whole-file再送信が必要なものはすべてデルタ転送を使用します。部分的に転送されたファイルの半分を読み取ることは、多くの場合、再度書き込むよりもはるかに高速です。
  • --inplace ファイルのコピーを回避します(ただし、転送全体が完了するまで宛先が何も読み取っていない場合のみ)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.