cat a > b
和
cp a b
如果它們在所有意圖和目的上功能相同,那麼哪一個更快?
答案1
答案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
設定選項來防止覆蓋目標文件noclobber
set -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