这些命令(`tar`)实际上是做什么的?有没有更好的办法?

这些命令(`tar`)实际上是做什么的?有没有更好的办法?

我正在查看一些有关创建发行版存储库的文档。但是,我无法准确理解这些命令的执行效果:

# cd /mnt/
# ls
centos-1  centos-2  centos-3
# for i in 1 2 3 
> do
> cd /mnt/centos-$i
> tar cpf - . | ( cd /var/ftp/ks/centos/; tar xpf - )
> done

我的(显然不正确的)概要是:循环遍历每张已安装的 CD ( /mnt/centos-<index>) 并创建一个tar保留权限的文件夹。然后,tar再次将该文件提取到另一个文件夹,并保留权限。

既然如此,为什么会这样呢?难道真的没有更好的办法吗?或者也许我错过了整个想法。

答案1

在此过程中建议使用 tar(或 cpio)而不是 cp 的原因是因为这些工具的操作方式。

cp 依次对每个文件对象进行操作,从磁盘读取它,然后将其写入新位置。由于源和目标的位置在磁盘上可能并不接近,因此这会导致在位置之间进行大量查找。

tar和cpio一次性读取尽可能多的内容,然后写入存档中。这意味着源文件将被一个接一个地读取,而目标文件将被一个接一个地写入(当然,允许进程切换),从而减少查找次数,从而节省时间。

答案2

该命令执行目录子树的精确的类似归档的副本(即 tar 保存权限、所有权、链接等的位置)。

首先,它是命令

tar cpf - . | ( cd /var/ftp/ks/centos/; tar xpf - )

相当于

tar cpf - . | tar -C /var/ftp/ks/centos -x -p -f -

其中-C指定 tar 在开始提取文件之前应更改为的工作目录。

也许这位同事只是不知道这个-C选项。

等价的还有:

cp -a * /var/ftp/ks/centos/

(其中-a--archive代表 -r --preserve=all --no-dereference --preserve=links,即 cp 保留权限、递归复制等,就像在进行精确的类似存档的复制时所期望的那样)

它不等效,因为 shell 模式匹配*不会捕获当前工作目录中的点文件。对于不同的源模式,tar选择的原因cp -a是它cp -a是 GNU 扩展而不是 POSIX,即tar解决方案将是更便携的解决方案。

tar选择cp没有任何性能原因。

相关内容