ファイルをコピーするためのcp対cat


12

cp a bcat a > b、違いは何ですか?

Linuxカーネルのソースツリー(arch/x86/boot/install.sh)のx86インストールスクリプトでは、両方が使用されます。

cat $2 > $4/vmlinuz
cp $3 $4/System.map

一方が他方よりも優れている場合、なぜ同じ形式を維持しないのですか?

回答:


14

catvs cpが重要な違いをもたらすもう1つの問題が私の頭に浮かびます。

定義上、catはスパースファイルを拡張し、ギャップを「実際の」ゼロバイトで埋めますが、cpは少なくともホールを保持するように指示できます。

スパースファイルは、スペースを確保するために、ゼロバイトのシーケンスがメタデータに置き換えられたファイルです。ddで作成してテストし、任意のツールで複製できます。

  1. スパースファイルを作成します(トラブルを避けるために事前に/ 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
  2. サイズを決めます-スペースを取ってはいけません。

    17> du -sh sparsetest
    0       sparsetest
  3. cpでコピーしてサイズを確認してください

    18> cp sparsetest sparsecp
    19> du -sh sparsecp
    0       sparsecp
  4. 猫と一緒にコピーしてサイズを確認してください

    20> cat sparsetest > sparsecat
    21> du -sh sparsecat
    1.3M    sparsecat
  5. 好みのツールを試して、それらの動作を確認してください

  6. 片付けをお忘れなく。

警告の最後の注記:これらの実験は、バックアップ計画の一部であるファイルシステムまたはシステムの健全性にとって重要なものである場合、ローカルのシステム管理者に名声を上げる可能性があります。バックアップツールの選択によっては、テラバイトのゼロに拡張された1つの0バイトファイルをバックアップするために、これまで考えられていたよりも多くのテープメディアが必要になる可能性があります。

catもcpも使用せずにコピーできないその他のファイルには、デバイススペシャルファイルなどが含まれます。デバイスノードを複製できるかどうか、または代わりに内容を簡単にコピーできるかどうかは、コピーツールの実装に依存します。


1
そのcpため、元のファイルと同じようにファイルcatが作成され、同じ内容の新しいファイルが作成されます。
Qian

どちらのツールもコンテンツを操作しますが、cp(少なくとも「モダンな」実装)は、ホール(catの古い実装がそのトラップにぶつかる)のような最近のいくつかの専門分野を認識しています。また、HFS +(MacOS)やFAT(MSDOS、USB-Sticksなど)などのスパースファイルの概念を認識していないファイルシステムもあり、フルサイズまで拡大されます。したがって、cpやcatが実際に変化をもたらさない星座があります。
Tatjana Heuser 2012年

ところで、GNUにcpはスパースファイルでの動作を制御するオプションがあります。のよう--sparse=neverに、コマンドラインで指定すると、cpと同じくらい遅くなりますcat
oguz ismail

6

キースのコメントによると、cpいくつかの権限を保持しcatumask指示に従って新しいファイルを作成します。したがって、$2のパーミッションは保持されず$4/vmlinuz、かなりクリーンですが、奇妙なパーミッションがオン$3に設定されている場合、それ$4/System.mapは保持されます。


それがcatの高速性を説明する理由ですか?
Nikhil Mulley、2012年

2
あるcat速いですか?

4

これら2つのケースではどちらも同等の機能を備えていますが、cpは純粋にファイル操作です。「このファイルを取り、そこにコピーを作成します」。

一方、catは、ファイルの内容をコンソールにダンプすることを目的としています。「このファイルを取得して画面に表示」し、忍者に画面を攻撃させ、出力を別の場所にリダイレクトします。

cpは一般に、リダイレクトだけではなく、場所Aから場所Bにバイトを直接コピーするだけなので、より効率的です。

猫になりますread bytes -> output to console -> intercept output -> redirect to new file


3
cat実際output to console -> intercept output -> redirect to new fileにはそうではありません。catの出力ファイルはstdoutまたは通常のファイルにすることができます。入力が出力と同じでない限り、ファイルに出力されます。

4
catコンソールとは何の関係もありません。どちらcatcp出力ファイルに入力ファイルと書き込みから読み取ります。を使用するcatと、出力ファイルはシェルによって開かれますが、を使用するcpと、出力ファイルはによって開かれcpます。これはパフォーマンスに違いはありません。cpより高速かもしれませんが、完全に異なる理由があります。いくつかの実装でcpは、ソースデバイスとターゲットデバイスに応じて、パフォーマンスに適したチャンクサイズを推測しようとします。の実装はcat気になりません。
Gilles 'SO-悪をやめる

2

それは本当に好みの問題です、私見。

ファイルの所有権/グループを保持するために-pスイッチを指定してcpコマンドを使用しない限り、技術的に実際の違いはありません。それ以外は、機能的には同じです。マルクの答えははるかに明確かつ詳細です。


3
cpなしで-p一部の権限が保持されません。たとえば、ソースファイルが実行可能である場合、cpはターゲットファイルを実行可能にしますが、実行可能にしcatません。
キース・トンプソン

いい視点ね!したがってvmlinuz、実行可能かどうか$2はわかりません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.