回答:
cat
vs cp
が重要な違いをもたらすもう1つの問題が私の頭に浮かびます。
定義上、catはスパースファイルを拡張し、ギャップを「実際の」ゼロバイトで埋めますが、cpは少なくともホールを保持するように指示できます。
スパースファイルは、スペースを確保するために、ゼロバイトのシーケンスがメタデータに置き換えられたファイルです。ddで作成してテストし、任意のツールで複製できます。
スパースファイルを作成します(トラブルを避けるために事前に/ tmpに変更します-最後の注意を参照してください):
15> cd /tmp
16> dd if=/dev/null of=sparsetest bs=512b seek=5
0+0 records in
0+0 records out
0 bytes (0 B) copied, 5.9256e-05 s, 0.0 kB/s
サイズを決めます-スペースを取ってはいけません。
17> du -sh sparsetest
0 sparsetest
cpでコピーしてサイズを確認してください
18> cp sparsetest sparsecp
19> du -sh sparsecp
0 sparsecp
猫と一緒にコピーしてサイズを確認してください
20> cat sparsetest > sparsecat
21> du -sh sparsecat
1.3M sparsecat
好みのツールを試して、それらの動作を確認してください
片付けをお忘れなく。
警告の最後の注記:これらの実験は、バックアップ計画の一部であるファイルシステムまたはシステムの健全性にとって重要なものである場合、ローカルのシステム管理者に名声を上げる可能性があります。バックアップツールの選択によっては、テラバイトのゼロに拡張された1つの0バイトファイルをバックアップするために、これまで考えられていたよりも多くのテープメディアが必要になる可能性があります。
catもcpも使用せずにコピーできないその他のファイルには、デバイススペシャルファイルなどが含まれます。デバイスノードを複製できるかどうか、または代わりに内容を簡単にコピーできるかどうかは、コピーツールの実装に依存します。
cp
はスパースファイルでの動作を制御するオプションがあります。のよう--sparse=never
に、コマンドラインで指定すると、cp
と同じくらい遅くなりますcat
。
キースのコメントによると、cp
いくつかの権限を保持しcat
、umask
指示に従って新しいファイルを作成します。したがって、$2
のパーミッションは保持されず$4/vmlinuz
、かなりクリーンですが、奇妙なパーミッションがオン$3
に設定されている場合、それ$4/System.map
は保持されます。
cat
の高速性を説明する理由ですか?
cat
速いですか?
これら2つのケースではどちらも同等の機能を備えていますが、cpは純粋にファイル操作です。「このファイルを取り、そこにコピーを作成します」。
一方、catは、ファイルの内容をコンソールにダンプすることを目的としています。「このファイルを取得して画面に表示」し、忍者に画面を攻撃させ、出力を別の場所にリダイレクトします。
cpは一般に、リダイレクトだけではなく、場所Aから場所Bにバイトを直接コピーするだけなので、より効率的です。
猫になりますread bytes -> output to console -> intercept output -> redirect to new file
。
cat
実際output to console -> intercept output -> redirect to new file
にはそうではありません。catの出力ファイルはstdoutまたは通常のファイルにすることができます。入力が出力と同じでない限り、ファイルに出力されます。
cat
コンソールとは何の関係もありません。どちらcat
とcp
出力ファイルに入力ファイルと書き込みから読み取ります。を使用するcat
と、出力ファイルはシェルによって開かれますが、を使用するcp
と、出力ファイルはによって開かれcp
ます。これはパフォーマンスに違いはありません。cp
より高速かもしれませんが、完全に異なる理由があります。いくつかの実装でcp
は、ソースデバイスとターゲットデバイスに応じて、パフォーマンスに適したチャンクサイズを推測しようとします。の実装はcat
気になりません。
cp
ため、元のファイルと同じようにファイルcat
が作成され、同じ内容の新しいファイルが作成されます。