从控制台存档的 TARBall 中提取文件

Posted

技术标签:

【中文标题】从控制台存档的 TARBall 中提取文件【英文标题】:Extract file from TARBall archived from console 【发布时间】:2020-04-29 13:27:04 【问题描述】:

下一个问题发生在我身上:

有一个 TAR 存档,我必须使用 file-roller 编译一段时间作为脚本例程,使用 file-roller 命令。 现在我不得不将我的脚本更改为更“技术性”和跨平台直接引用 TAR 命令: 为此,我只需 cd 到特定目录并使用此命令:

tar -cvzf "path/to/archive.tar.gz" "." > /dev/null 2>&1

“.”的问题目录被转换为档案内的路径,文件存储在子目录“。”下。下一种方式:

archive.tar.gz
-> ./
   -> file1.ext
   -> file2.ext

我已经设法使用--transform 选项以这种方式将文件恢复到存档的根文件夹中:

tar -cvzf "path/to/archive.tar.gz" --transform "s,.,," "." > /dev/null 2>&1

结果是正确组织的存档,文件移动到存档根文件夹:

archive.tar.gz
-> file1.ext
-> file2.ext

file-roller 可以读取即将发布的存档,而 tar 的文件提取功能已损坏:

tar -x -f "path/to/archive.tar" -C "$TEMP_DIR/" file1.ext

TAR 必须立即报告:存档或类似文件中没有此类文件或目录。

tar -x -f "path/to/archive.tar" -C "$TEMP_DIR/"

仍然可以正常工作,并将所有文件从存档中提取到“$TEMP_DIR/”中。

【问题讨论】:

我从未与--transform 合作过,因此我仅将其作为评论而非答案。据我所知,您的--transform "s,.,," 删除了文件名中的所有句点,或者至少删除了每个名称中遇到的第一个句点。但是您想提取一个名为tarred-file.ext 的文件,该文件确实有句点,因此找不到该文件。使用选项--show-transformed-names 显示transform 的效果。 您可以使用tar -tvf yourfile.tar 来查看tar 文件的内容(-t 选项)。 【参考方案1】:

你需要去掉第一个点和斜线:

tar -cvzf "path/to/archive.tar.gz" --transform "s,./,," "." > /dev/null 2>&1

或者你可以简单地做(如果你没有隐藏文件)

tar -cvzf "path/to/archive.tar.gz" * > /dev/null 2>&1

对于提取,您可以直接在 tar.gz 上运行:

tar zxf "path/to/archive.tar.gz" -C "$TEMP_DIR/" tarred-file.ext

【讨论】:

说得好!它现在终于可以工作了,但它仍然有 /./ 存档内的目录,差别很小的是现在存档的文件直接在根目录中。我可以提出一个建议,但不知道如何摆脱它。 如果您使用第二种形式,您将没有该条目。 嗯,更多奇怪的发现即将出现:按照您的指示,第一种形式让我对 tar 中存档的当前目录的自引用为空(如前所述)。第二种形式对我来说似乎有点“不可行”,让我留下 tarball 说“stat 命令失败,没有这样的文件或目录”@Philippe empty self-reference to current directory archived inside tar 应该没关系。 No such file or directory 是当你做 taruntar 的时候? 在做tar的时候。通过file-roller@Philippe 创建文件时,由于一个人不存在而导致自我引用的混乱

以上是关于从控制台存档的 TARBall 中提取文件的主要内容,如果未能解决你的问题,请参考以下文章

tar命令是怎么使用?

从python中的tar存档中提取压缩的gz文件

从存档中提取精确文件的快速方法

从 zip 存档中提取单个文件

快速从存档中提取所选文件

从资产存档和预构建的二进制文件统一构建目标包