我使用以下伪脚本创建已安装软件的 TAR
mkdir tmp
ln -s /path/to/app1/bin tmp/app1
ln -s /and/path/going/to/the-app-2 tmp/app2
tar -c --dereference -f apps.tar tmp
我需要--dereference
这里的选项来跟踪我刚刚在 中创建的链接tmp
。我创建链接的首要原因是将目录存储在存档中的名称与文件系统中的名称不同。
到目前为止,它运行良好。但是,我现在遇到的情况是,它还/path/to/app1
包含链接,以及我不想关注的链接。
修改一下命令是否可行tar
?还是我需要彻底改变构建档案的方式?
答案1
我认为没有办法只进行部分取消引用。你可以这样做
tar -cf apps.tar /path/to/app1/bin /and/path/going/to/the-app-2
然后使用 -C 将它们提取到不同的根目录中
-C, --directory=DIR
change to directory DIR
例如
mkdir tmp
tar -C tmp -xf apps.tar
这与您当前创建档案的方式具有类似的效果。
您也可以使用 -C 指向任何现有目录。
答案2
您真的需要 tarball 中的目录结构与磁盘上的目录结构不同吗?
如果没有,那么您可以直接按原样将它们打包:
tar -cf file.tar /path/1 /path/2
答案3
我可以复制,而不是链接。不幸的是,这会增加一些开销(文件相当大)。当然,它最多会增长两倍,因为 tarring 本身也是一种复制形式。
答案4
如果你是root
,那么最好的办法是使用 mount 的 bind 命令来硬链接你想要打包的目录,而不是符号链接。这样你就不需要使用取消引用选项了。
mkdir tmp
mount --bind /path/to/app-1 tmp/app-1
mount --bind /path/to/app-2 tmp/app-2
tar cf apps.tar tmp
确保在这些目录发生意外之前将其卸载。请参阅这些警告。