使用不同名称的 tar 文件

使用不同名称的 tar 文件

为了使我的环境可部署,我偶尔会压缩一些方便的文件和脚本:

tar -czvf env.tgz .vimrc .vim/ bin/lsl bin/s

我想添加.bashrc到其中,但其中有一些敏感信息,因此我维护.bashrc-deploy这些信息,然后一旦 tarball 位于新服务器上,我就可以简单地重命名。但是,我真的希望 tarball.bashrc从一开始就有正确的名称,这样我就不必重命名。我考虑编写一个脚本来临时重命名文件并制作 tarball,如下所示:

#!/bin/bash
mv .bashrc .bashrc-real
mv .bashrc-deploy .bashrc
tar -czvf env.tgz .bashrc .vimrc .vim/ bin/lsl bin/s
mv .bashrc .bashrc-deploy
mv .bashrc-real .bashrc

但是,是否tar有任何内部方法可以将someFile名称存储anotherName在 tarball 中?

答案1

使用pax(创建tar档案的标准(POSIX)命令)并bsdtar查看-s选项:

pax -s '/\.bashrc-deploy/.bashrc/' -w -x ustar . | gzip > a.tar.gz

bsdtar -s '/\.bashrc-deploy/.bashrc/' -zcf a.tar.gz .

但请注意,上面的代码会将.bashrc-deploy字符串替换为.bashrc要添加到存档中的任何成员的任何文件路径中的字符串。如果你只想替换./.bashrc-deploy当前目录中的,你必须这样写:

pax -s '|^\./\.bashrc-deploy$|./.bashrc|' -w -x ustar .

(尽管通过阅读 POSIX pax 规范,我不确定它是否能保证每个 pax 实现都能以这种方式工作。它应该与 bsdtar 一起工作,因为只有一个实现)。

答案2

实现此目的的一种方法是链加载。

.bashrc

#!/bin/bash

# ...
# Non-private information
# ...

[[ -r ~/.bashrc-private ]] && . ~/.bashrc-private

然后(仅)将您的私人内容放入其中~/.bashrc-private,将其他所有内容放入~/.bashrc.然后部署即可~/.bashrc

答案3

使用 GNU tar(非嵌入式 Linux 和 Cygwin 上的默认 tar 实现):

tar czf env.tgz --transform 's/-deploy$//' .bashrc-deploy .profile …

使用 pax(cpio 和 tar 的 POSIX 替代品)也可以实现这一点,不幸的是,许多默认的 Linux 安装中都没有它,BSD tar 也是如此:

pax -w -x ustar '-s/-deploy$//' .bashrc-deploy .profile … | gzip >env.tgz
bsdtar -czf env.tgz '-s/-deploy$//' .bashrc-deploy .profile …

在所有三种情况下,语法与ors/REGEX/REPLACEMENT/相同。edsed


我质疑你的做法。在不同的机器上拥有相同名称但内容不同的文件很难维护。此外,如果某些文件必须保持私密,就很容易出错。我的建议是将配置文件存储在子目录中,并使用符号链接。例如, if.bashrc必须是私有的且特定于站点的,并且.profile必须是公共的并且在任何地方都相同:

.bashrc -> etc/local/private/.bashrc
.profile -> etc/.profile

创建etc/local一个指向名称与站点相关的目录(例如~/etc/home~/etc/work)的符号链接,确保~/etc/private~/etc/*/private只能由您访问,然后就完成了。您可以部署整个~/etc目录,并且只需要etc/local在解压缩存档后设置符号链接(或者更好的是,从版本控制)。

对于类似 的文件.bashrc(可能主要是与站点无关且公开的),请将文件分为两个(或最多四个)部分:公共部分和私有部分(如果需要,还可以加上站点特定的文件)。主要部分包括局部部分:

if [ -e ~/etc/private/.bashrc ]; then . ~/etc/private/.bashrc; fi
if [ -e ~/etc/local/.bashrc ]; then . ~/etc/local/.bashrc; fi
if [ -e ~/etc/local/private/.bashrc ]; then . ~/etc/local/private/.bashrc; fi

在用编程语言编写的文件中,您可以动态测试主机名或域名或其他与站点相关的特征,这使您可以维护单个文件。

case $HOSTNAME in
  darkstar) alias foo=some-local-command;;
esac

里面有机密内容有点令人惊讶.bashrc。如果您正在定义环境变量,他们属于~/.profile

相关内容