对于递归复制目录,使用tar
打包一个目录,然后将输出通过管道传输到另一个目录tar
进行解包似乎比使用cp -r
(或cp -a
)要快得多。
这是为什么?为什么不能通过cp
在后台以同样的方式执行来加快速度?
编辑:当我尝试复制包含数万个文件和文件夹的大型目录结构时,我注意到了这种差异,这些文件和文件夹嵌套很深,但总大小只有约 50MB。不确定这是否相关。
答案1
Cp
在所有文件上循环执行打开-读取-关闭-打开-写入-关闭。因此,从一个位置读取和写入另一个位置完全交错进行。Tar|tar
在单独的进程中执行读取和写入,此外还tar
使用多个线程“同时”读取(和写入)多个文件,从而有效地允许磁盘控制器同时获取、缓冲和存储许多数据块。总而言之,tar
允许每个组件高效工作,同时cp
将问题分解为不同的、低效的小块。
答案2
您的编辑朝着好的方向发展:cp
并不一定比 慢tar | tar
。取决于文件的数量和大小。对于大文件,plaincp
是最好的,因为它只是简单地推送数据。对于许多小文件,物流是不同的,tar
可能会做得更好。例如,参见这个答案。