これら2つのコマンド間に違いはありますか?

これら2つのコマンド間に違いはありますか?
cat a > b

そして

cp a b

すべての意図と目的が機能的に同じであれば、どちらがより速いでしょうか?

答え1

機能的には同じだと思います。

どちらが速いかを推測する必要がある場合は、私はこう言います。CPコマンドの目的は、コピー目的でのみファイル操作を実行することであるため、最適化されます。

それに比べて次のような意味があります。つながるファイルとは、複数のファイルをシリーズに結合することを意味します。ファイルを指定しないと、コンソールにファイルが表示されます(お知らせいただいた@bahamatに感謝します)。この例では、出力は別のファイルにリダイレクトされます。私の考えでは、この間接的な方法は直接的な方法よりも効率が悪いですcp

非常に大きなファイルの場合、時間を測定してみると面白いかもしれませんが、通常のサイズのファイルでは違いが目立つように見えるかもしれません。 /usr/bin/time で実験を繰り返すことで、一方が他のものよりも一貫して高速または遅いことを確認できます。

このような質問をした特別な理由はありますか?それとも単に好奇心から出てきたのかもしれません(もちろん間違っていません)。

答え2

機能は似ていますが、詳細な部分は異なります。デフォルトでは、両方とも最初のファイルから多くのデータを読み取り、それを別のファイルに書き込みます。

私が作るときストレスLinuxの場合:

$ strace cat /etc/fstab > test.txt
...
open("/etc/fstab", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=691, ...}) = 0
fadvise64_64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, "# /etc/fstab: static file system"..., 32768) = 691
write(1, "# /etc/fstab: static file system"..., 691) = 691
read(3, "", 32768)                      = 0
close(3)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?

$ strace cp /etc/fstab test.log
...
open("/etc/fstab", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=691, ...}) = 0
open("test.log", O_WRONLY|O_CREAT|O_EXCL|O_LARGEFILE, 0644) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
read(3, "# /etc/fstab: static file system"..., 32768) = 691
write(4, "# /etc/fstab: static file system"..., 691) = 691
read(3, "", 32768)                      = 0
close(4)                                = 0
close(3)                                = 0
_llseek(0, 0, 0xbfaa3fb0, SEEK_CUR)     = -1 ESPIPE (Illegal seek)
close(0)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?

答え3

大きな違いはありません。両方とも、古いファイルの内容を同じ内容の新しいファイルにコピーします。ターゲットが既存のファイルの場合は、両方ともターゲットを上書きします。

一部の古いシステムでは、コピーバイナリを使用しようとすると、コピーが停止したり、行が切り捨てられたりする可能性がありますcat。なぜなら、ヌル文字がブロックされる可能性があるからです。私はこれが現在使用しているUNIXシステムでは問題にならないと思います。cp問題がないことを保証します。

cpディレクトリをターゲットとして指定できます。ファイルは元のファイルと同じ名前で新しいディレクトリにコピーされます。

宛先が存在しない場合、cpソースファイルの許可ビットが使用され、現在のファイルによって変更されます。マスク

シェルでcat … >targetオプションを設定して、ターゲットファイルを上書きするのを防ぎます。noclobberset -C。オプション()をcp渡すと、ターゲットファイルが上書きされるのを防ぎます。-ialias cp='cp -i'cp

元のファイルの日付を維持するのが便利なことがよくあります。あなたはそれを使用することができますcp -p

パフォーマンスは、ファイルサイズ、ファイルシステム、ソースおよびターゲットディスクの種類、オペレーティングシステムなどによって異なります。Linuxでのrawディスクコピーの場合、私はほとんど違いを見つけませんでした。

答え4

fastercpより猫みたい

root@SHW:/tmp# time cp debug.log test1
real    0m0.021s
user    0m0.000s
sys 0m0.000s
root@SHW:/tmp# time cat debug.log > test2
real    0m0.013s
user    0m0.000s
sys 0m0.000s
root@SHW:/tmp# du -h debug.log 
4.0K    debug.log
root@SHW:/tmp# file debug.log
debug.log: ASCII text

関連情報