例如,
tar -cSf - -C /mnt/abc . | tar xvf - -C /mnt/def
这和下面这个不一样吗:
cp -RT /mnt/abc /mnt/def
?
答案1
它们大部分是相同的,因为它们都会复制目录树。它们在元数据处理方面有所不同。
tar cf - … | tar xf - …
通过 tar 格式封送所有数据。这意味着任何无法以 tar 格式表示的元数据都会丢失。tar 格式有几种变体,因此具体丢失的内容取决于 tar 实现。以下是当前 GNU tar 的一些限制(其中一些可以通过切换到不同的 tar 格式来克服):
- 文件名长度(255 字节是可以的,我不知道确切的限制)、用户和组 ID(最多 65535 是可以的)、文件大小(最多 8GB 是可以的)等方面可能会受到限制。
- 例如,路径长度超过 100 个字符且树中至少有两个硬链接的文件将无法被正确复制(我忘记了具体的行为是什么)。
- 访问控制列表将不会被复制。
- 时间戳只能精确到最接近的秒。
cp -RT
不会保留大量元数据。特别是,它不会保留文件时间和所有权。另一方面,使用 GNU cp,cp -a
将保留几乎所有的元数据(我无法找出它的故障,除了在某些特殊情况下的目录访问时间和某些操作系统上的亚秒时间戳)。
答案2
cp
将逐个字符复制。使用内核管道支持,我们可以逐块复制文件。我过去使用 tar 的原因是为了进行网络传输,如下所示:
tar czv ListOfFiles | ssh remote.box.com tar xz -C /home/user/PathToCopy
看此链接更多细节。
答案3
使用 tar-copy 您可以:
- 在管道之间放置其他程序(例如,pv 用于测量复制速度)
- 或者使用 netcat 将其传输到另一台机器
- 您可以使用 --include 和 --exclude 来避免复制某些文件或仅包含某些文件
答案4
您的cp
命令不会保留时间戳,您需要添加-p
开关。-d
还需要保留符号链接。