创建包含隐藏文件和文件夹的存档会创建一个 .root 条目

创建包含隐藏文件和文件夹的存档会创建一个 .root 条目

我正在尝试存档一个包含隐藏文件和文件夹的项目文件夹,但我得到的文件夹的根目录条目为.。这很烦人。通常:

tar -czf $ARCHIVE_NAME -C $DIR .

将创建如下档案

./package.json
./.git
./.gitignore
.
.
.

我希望档案的根目录是实际的文件和文件夹,而不是条目.。例如

package.json
.git
.gitignore
.
.
.

我怎么做?

* 编辑 *

下图可能有助于澄清这个问题。

  • 左侧是使用项目的 GUI 工具创建的档案(两天前)。
  • 右侧是使用上述tar命令创建的档案。

注意“位置”栏;右侧的档案应该是/,并且不是 /./

在此处输入图片描述

答案1

./表示当前目录。您的两个列表完全相同。

./在列出存档时,在文件前面显示有助于处理具有特殊名称的文件。文件名将-file显示为./-file允许第二个工具处理。

答案2

更改命令

tar -czf $ARCHIVE_NAME -C $DIR .

tar -czf $ARCHIVE_NAME -C $DIR ./*

应该可以解决问题。这样,您就不是说“将目录添加.到存档”,而是说“将目录中的所有这些文件添加.到存档”。

答案3

此命令将压缩当前目录中不带前导 .tar 的文件./

tar cf /some/tarfile.tar *

当然,它不会包含以句点开头的文件名,这可能不是您想要的。您可以添加其他通配符来捕获这些:

tar cf /some/tarfile.tar * .[a-zA-Z]*

但这不是一个通用的解决方案;您必须知道目录中的文件名,以便可以制作适当的通配符。

GNU tar(大多数 Linux 发行版都使用)具有使用表达式转换文件名的功能sed。这将./在创建存档时从文件中删除:

tar cf /some/tarfile.tar --transform 's,^\./,,' .

生成的档案中仍然会包含“.”目录本身的条目。

的某些版本tar可以从文件中读取要打包的文件的名称。您可以利用该功能来执行此操作:

ls -a | egrep -v '^\.\.?$' | tar cf - -T /dev/stdin

该管道构建当前目录中所有文件的列表,删除...条目,然后将其余名称通过管道传输到。tar 从读取的文件名(其标准输入)tar中创建存档。/dev/stdin

相关内容