如何压缩包含点文件的目录,但忽略对目录本身的所有引用

如何压缩包含点文件的目录,但忽略对目录本身的所有引用

我想备份主目录,包括通常的点文件数组,但我不希望备份甚至提及目录本身或其权限。所以,如果我有一个像这样的结构

homedir
    .dotfile
    somesubdir
        subfile
    outerfile

我想要一个如下所示的焦油:

.dotfile
somesubdir
    subfile
outerfile

请注意,没有任何对 homedir 的引用,甚至连 ./ 都看不到。

我实际上有一个解决方案(发布在下面),但是当我试图将其附加到让我想到它的问题上时,一些主持人说它需要自己的问题。就这样,我希望它有用。

答案1

假设您位于以下目录的父目录中homedir

tar -c -f homedir.tar -C homedir .

这将使tartreat.视为相对于homedir。该-C选项基本上就像cd进入给定目录一样。文件和目录将存储在带有路径前缀的存档中./

要摆脱./路径前缀,使用 BSD tar

tar -c -f homedir.tar -C homedir -s '/^\.\//' .

或者,使用 GNU tar

tar -c -f homedir.tar -C homedir --transform 's/^\.\//' .

答案2

使用 Bash 4.4.19 和 GNU tar 1.29,可以进行以下工作。 'dotglob' 使 * 能够识别点和字母,而 'GLOBIGNORE' 设置为忽略“.”。和 ”..”。大括号允许我将输出定向到当前目录,而 pushd 和 popd 使 tar 发生在内容所在的位置。我不使用 tar 的 -C 选项,因为这会弄乱“*”全局。

shopt -s dotglob
GLOBIGNORE=".:.."
{
  pushd homedir >/dev/null
  tar --create --file=- *
  popd >/dev/null
} >inner.tar
shopt -u dotglob

请注意,输出文件设置为“-”,这意味着标准输出最终会转到文件inner.tar。重定向到 /dev/null 时不会提及目录更改。

相关内容