![这些命令(`tar`)实际上是做什么的?有没有更好的办法?](https://linux22.com/image/17613/%E8%BF%99%E4%BA%9B%E5%91%BD%E4%BB%A4%EF%BC%88%60tar%60%EF%BC%89%E5%AE%9E%E9%99%85%E4%B8%8A%E6%98%AF%E5%81%9A%E4%BB%80%E4%B9%88%E7%9A%84%EF%BC%9F%E6%9C%89%E6%B2%A1%E6%9C%89%E6%9B%B4%E5%A5%BD%E7%9A%84%E5%8A%9E%E6%B3%95%EF%BC%9F.png)
我正在查看一些有关创建发行版存储库的文档。但是,我无法准确理解这些命令的执行效果:
# 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没有任何性能原因。