ディレクトリを再帰的にコピーする場合、 を使用してtar
ディレクトリをパックし、その出力を別のディレクトリにパイプして解凍する方が、 (または)tar
を使用するよりもはるかに高速です。cp -r
cp -a
これはなぜでしょうか? また、cp
内部で同じ方法で実行しても、なぜ高速化できないのでしょうか?
編集: 深くネストされた数万のファイルとフォルダーを含む、合計で約 50 MB しかない巨大なディレクトリ構造をコピーしようとしたときに、この違いに気付きました。それが関係があるかどうかはわかりません。
答え1
Cp
すべてのファイルに対して、オープン、読み取り、クローズ、オープン、書き込み、クローズのループを実行します。したがって、ある場所からの読み取りと別の場所への書き込みは完全にインターリーブされます。Tar|tar
読み取りと書き込みは別々のプロセスで実行され、さらにtar
複数のスレッドを使用して複数のファイルを「一度に」読み取り (および書き込み) できるため、ディスク コントローラは多くのデータ ブロックを一度に取得、バッファリング、および保存できます。全体として、tar
各コンポーネントが効率的に動作し、問題を異なる非効率的な小さなチャンクに分割できますcp
。
答え2
編集は良い方向に進んでいます。cp
は必ずしも より遅くなるわけではありませんtar | tar
。 たとえば、ファイルの量とサイズによって異なります。 大きなファイルの場合、cp
データを移動するだけの単純な作業なので、プレーンが最適です。 小さなファイルがたくさんある場合は、ロジスティクスが異なり、tar
より適している可能性があります。 たとえば、この答え。