GNU/Linux >> Linux の 問題 >  >> Linux

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

解決策 1:

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

rsync -a source dest

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

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

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

cp -au source dest

解決策 2:

ローカル ファイル システムにコピーするとき、私は次のオプションを指定して 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 -)

解決策 3:

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

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

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

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

/src/ の末尾のスラッシュに注意してください 重要です。

解決策 4:

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 -

これらはすべてローカル コピー用であることに注意してください。

解決策 5:

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

532Gb を移動するには 1,753,200 ファイルに分散されたデータ そんな時がありました:

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

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

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


Linux
  1. cp:ディレクトリの省略 – Linux でディレクトリをコピー中にエラーが発生しました

  2. .tar.gz ファイルの作成時にディレクトリを除外する

  3. ツリーとしてのCentOSディレクトリ構造?

  1. 1TB のスパース ファイルのコピー

  2. スラッシュと rsync コマンド

  3. rsync ディレクトリ内の N 個の最新ファイル

  1. Linux –何千ものファイルを含む大きなディレクトリを効率的に削除しますか?

  2. Tarballを抽出するときにターゲットディレクトリを作成しますか?

  3. tar - 抽出時に先頭のディレクトリ コンポーネントを削除する