這兩個指令有差別嗎?

這兩個指令有差別嗎?
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則使用來源檔案的權限位,並由目前檔案修改遮罩

您可以透過在 shell 中cat … >target設定選項來防止覆蓋目標文件noclobberset -C。您可以cp透過傳遞-i選項 ( alias cp='cp -i')來防止覆蓋目標檔案;cp會要求確認。

保留原始文件的日期通常很有用。你可以用cp -p它。

效能會有所不同,具體取決於檔案的大小、檔案系統、來源磁碟和目標磁碟的類型、作業系統等。對於 Linux 下的原始磁碟副本,我發現幾乎沒有差別。

答案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

相關內容