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

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

そして

cp a b

実質的に機能的に同じである場合、どちらが高速でしょうか?

答え1

機能面では同じだと思います。

どちらが速いか推測するなら、cpコマンドの目的は、コピー目的のみでファイル操作を行うことなので、そのために最適化されます。

対照的に、は連結するfiles は、複数のファイルを連続して結合することを意味します。ファイルが指定されていない場合は、コンソールにファイルが表示されます (教えてくれた @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現在のumask

シェルでオプションをcat … >target設定することで、ターゲットファイルを上書きしないように保護できます。noclobberset -Cオプション ( )cpを渡すことで、ターゲット ファイルの上書きを防ぐことができます。確認を求めます。-ialias cp='cp -i'cp

元のファイルの日付を保存すると便利な場合が多くあります。cp -pそのために使用できます。

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

答え4

faster猫の方がCPよりいいみたい

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

関連情報