對於遞歸複製目錄,使用tar
打包目錄然後將輸出通過管道傳輸到另一個目錄tar
進行解包似乎比使用cp -r
( 或cp -a
) 快得多。
為什麼是這樣?為什麼不能透過cp
在引擎蓋下以相同的方式進行操作來加快速度呢?
編輯:當我嘗試複製包含數萬個檔案和資料夾的巨大目錄結構時,我注意到了這種差異,這些檔案和資料夾深度嵌套,但總共只有大約 50MB。不確定這是否相關。
答案1
Cp
在所有檔案上循環執行開啟-讀取-關閉-開啟-寫入-關閉。因此,從一個地方讀取資料和向另一個地方寫入資料是完全交錯發生的。Tar|tar
在單獨的進程中進行讀取和寫入,此外還tar
使用多個線程「一次」讀取(和寫入)多個文件,從而有效地允許磁碟控制器一次獲取、緩衝和儲存許多資料區塊。總而言之,tar
允許每個組件高效工作,同時cp
將問題分解為不同的、低效的小塊。
答案2
您的編輯朝著好的方向發展:cp
不一定比tar | tar
.例如取決於文件的數量和大小。對於大文件,普通文件cp
是最好的,因為這是推送資料的簡單工作。對於許多小文件,物流是不同的,並且tar
可能會做得更好。請參閱範例這個答案。