- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我已经编写了以下代码来对文件进行压缩,代码可以正常工作,但奇怪的是,如果我解压缩存档,文件权限就会消失,所以我无法读取它,除非我随后对文件进行 chmod:
package main
import (
"archive/tar"
"io/ioutil"
"log"
"os"
)
func main() {
c, err := os.Create("/path/to/tar/file/test.tar")
if err != nil {
log.Fatalln(err)
}
tw := tar.NewWriter(c)
f, err := os.Open("sample.txt")
if err != nil {
log.Fatalln(err)
}
fi, err := f.Stat()
if err != nil {
log.Fatalln(err)
}
hdr := &tar.Header{Name: f.Name(),
Size: fi.Size(),
}
if err := tw.WriteHeader(hdr); err != nil {
log.Fatalln(err)
}
r, err := ioutil.ReadFile("sample.txt")
if err != nil {
log.Fatalln(err)
}
if _, err := tw.Write(r); err != nil {
log.Fatalln(err)
}
if err := tw.Close(); err != nil {
log.Fatalln(err)
}
}
知道我做错了什么吗?
最佳答案
您没有保留文件的原始权限。您正在手动创建标题,并仅指定名称和大小。相反,使用 tar.FileInfoHeader
构建 header 。
package main
import (
"archive/tar"
"io/ioutil"
"log"
"os"
)
func main() {
c, err := os.Create("/path/to/tar/file/test.tar")
if err != nil {
log.Fatalln(err)
}
tw := tar.NewWriter(c)
f, err := os.Open("sample.txt")
if err != nil {
log.Fatalln(err)
}
fi, err := f.Stat()
if err != nil {
log.Fatalln(err)
}
// create header from FileInfo
hdr, err := tar.FileInfoHeader(fi, "")
if err != nil {
log.Fatalln(err)
}
if err := tw.WriteHeader(hdr); err != nil {
log.Fatalln(err)
}
// instead of reading the whole file into memory, prefer io.Copy
r, err := io.Copy(tw, f)
if err != nil {
log.Fatalln(err)
}
log.Printf("Wrote %d bytes\n", r)
}
另请注意,我使用 io.Copy
将文件(io.Reader
)中的数据复制到 tar 编写器(io.Writer
)。这对于较大的文件会更好。
另外 - 请特别注意文档中的这条注释:
Because os.FileInfo's Name method returns only the base name of the file it describes, it may be necessary to modify the Name field of the returned header to provide the full path name of the file.
在这个简单的示例中,您只是在使用 sample.txt,因此您应该不会遇到麻烦。如果您想在您的 tar 中保留目录结构,您可能需要修改 header 中的 Name
字段。
关于戈朗 : file extracted from tar throws permissions error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28516864/
我正在使用 tf 函数列出 tar.gz 文件的内容。它非常大~1 GB。大约有 1000 个文件以年/月/日文件结构组织。 列表操作需要一些时间。似乎列表应该很快。谁能告诉我内部原理? 谢谢- 最佳
如何将信息通过管道传输到 tar 中并指定文件名? 最佳答案 类似于: tar cfz foo.tgz --files-from=- 但请记住,这不适用于所有可能的文件名;您应该考虑使用 --null
我总是用 tar czf file.tar.gz dirname而不是 tar -czf file.tar.gz dirname (没有 - )因为更快 我知道......从文档中,我所做的是错误的。
我有一个小型的 bash 单行代码,可以从各种来源下载存档列表。以下是包含该列表的文件示例: http://this-is-url1/url1.tar.gz http://www.this-is-ur
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
假设我在服务器 A 上使用 tar -czvf subdir.tgz subdirectory/* 创建了一个 tar 存档。 .如果我在服务器 B 上有一个并行结构,我已将此 tarball 复制到
我看到Linux tar有一个选项--overwrite。但是覆盖似乎是默认设置。而且,指定tar --no-overwrite不会更改此行为,因为信息文件似乎暗示了这一点。 那么,该选项实际上是做什
我需要创建一个任意大的 tarfile 用于测试,但不希望它写入磁盘。 最简单的方法是什么? 最佳答案 您可以轻松地使用 python 生成这样的 tarfile: mktar.py: #!/usr/
[root@c0002242 lfeng]# tar -zxvf/opt/test/ALLscripts.tar.gz -C/opt/test1 tar:这看起来不像 tar 存档 tar:跳到下一个
tar -xvzf $文件名.tar.gz || { 退出 $?; } 这里我的脚本将退出并显示错误代码 141。我使用的是 Fedora Core 6 和 tar 版本 1.15 这种情况不会一直发
我无法运行 docker-compose up 或 docker-compose build --no-cache。两者都以 ERROR: Error processing tar file(arch
我对 linux 平台非常陌生,我想为 ubuntu 提取 gnutls。如果我做, $ls 然后,它将在下面显示这些文件。 gnutls-3.2.1.tar.lz gnutls-3.2.1.tar.
我有一个巨大的 tarbell 存档,其中包含过大或损坏的 error_log,导致存档在尝试解压缩时挂起。有没有办法在解压缩或提取存档之前从存档中删除它,而无需在 Mac OS X 终端上提取该特定
我正在尝试针对特定用例评估 Artifactory,并且正在寻找可以支持将 Artifactory 用于文件存储库的文档。 我找到的只是一个用于部署 Artifactory 的文档,这些文档已存档在
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我想写一个有两个参数的脚本1. 父目录名称(例如 mainFolder)2.要创建的tar名称 父目录将包含子文件夹(文件夹 1、文件夹 2、文件夹 3 等)。我需要一个脚本来创建“mainFolde
假设我在 /tmp 中。我想压缩 /tmp/aaa/123,/tmp/bbb/222。我使用的命令是:tar -vczf/tmp/my.tar.gz/tmp/aaa/123/tmp/bbb/222。这
我有一个bzip2ed tar 文件和一个包含文件列表的文本文件。我想从 tar 中提取文本文件中列出的文件,将它们添加到一个新的 tar 中,然后从第一个 tar 中删除它们。 例如,如果我有这样一
本文实例讲述了Python打包文件夹的方法。分享给大家供大家参考,具体如下: 1、zip ?
我输入这个命令su -c busybox tar -xvf/storage/emulated/0/Download/andrax.r5-build5.tar.xz -C/data/data/com.t
我是一名优秀的程序员,十分优秀!