从控制台存档的 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 命令失败,没有这样的文件或目录”@Philippeempty self-reference to current directory archived inside tar
应该没关系。 No such file or directory
是当你做 tar
或 untar
的时候?
在做tar
的时候。通过file-roller
@Philippe 创建文件时,由于一个人不存在而导致自我引用的混乱以上是关于从控制台存档的 TARBall 中提取文件的主要内容,如果未能解决你的问题,请参考以下文章