- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
所以我试图从多个目录和文件创建一个 tar.gz 文件。与以下用法相同的东西:
tar -cvzf sometarfile.tar.gz somedir/ someotherdir/ somefile.json somefile.xml
假设目录中有其他目录。我有这个作为输入:
paths := []string{
"somedir/",
"someotherdir/",
"somefile.json",
"somefile.xml",
}
并使用这些:
func TarFilesDirs(paths []string, tarFilePath string ) error {
// set up the output file
file, err := os.Create(tarFilePath)
if err != nil {
return err
}
defer file.Close()
// set up the gzip writer
gz := gzip.NewWriter(file)
defer gz.Close()
tw := tar.NewWriter(gz)
defer tw.Close()
// add each file/dir as needed into the current tar archive
for _,i := range paths {
if err := tarit(i, tw); err != nil {
return err
}
}
return nil
}
func tarit(source string, tw *tar.Writer) error {
info, err := os.Stat(source)
if err != nil {
return nil
}
var baseDir string
if info.IsDir() {
baseDir = filepath.Base(source)
}
return filepath.Walk(source,
func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
header, err := tar.FileInfoHeader(info, info.Name())
if err != nil {
return err
}
if baseDir != "" {
header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, source))
}
if err := tw.WriteHeader(header); err != nil {
return err
}
if info.IsDir() {
return nil
}
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
_, err = io.Copy(tw, file)
if err != nil {
log.Println("failing here")
return err
}
return err
})
}
问题:如果目录很大,我会得到:
archive/tar: write too long
错误,当我删除它时一切正常。
用完了想法,并为此浪费了很多时间试图找到解决方案......
有什么想法吗?
谢谢
最佳答案
在仔细查看 tar.FileInfoHeader 文档之前,我遇到了类似的问题:
FileInfoHeader creates a partially-populated Header from fi. If fi describes a symlink, FileInfoHeader records link as the link target. If fi describes a directory, a slash is appended to the name. 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.
本质上,FileInfoHeader 不能保证在您使用 WriteHeader 写入之前填写所有 header 字段,如果您查看实现,Size 字段仅设置在 regular 上。文件。您的代码片段似乎只处理目录,这意味着如果您遇到任何其他非常规文件,您将写入大小为零的 header ,然后尝试将磁盘上可能非零大小的特殊文件复制到 tar 中。 Go 返回 ErrWriteTooLong 以阻止您创建损坏的 tar。
我想到了这个,从那以后就再也没有遇到过这个问题。
if err := filepath.Walk(directory, func(path string, info os.FileInfo, err error) error {
if err != nil {
return check(err)
}
var link string
if info.Mode()&os.ModeSymlink == os.ModeSymlink {
if link, err = os.Readlink(path); err != nil {
return check(err)
}
}
header, err := tar.FileInfoHeader(info, link)
if err != nil {
return check(err)
}
header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, directory))
if err = tw.WriteHeader(header); err != nil {
return check(err)
}
if !info.Mode().IsRegular() { //nothing more to do for non-regular
return nil
}
fh, err := os.Open(path)
if err != nil {
return check(err)
}
defer fh.Close()
if _, err = io.CopyBuffer(tw, fh, buf); err != nil {
return check(err)
}
return nil
})
关于go - 尝试从文件和目录创建 tar.gz 文件时出现 `write too long` 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38454850/
我想将所有 .gz 文件解压缩到一个文件夹中,然后将它们合并到一个新文件中。我可以在不为每个 .gz 文件生成未压缩文件的情况下执行此操作吗? 非常感谢! 最佳答案 你可以这样做: zcat *.gz
我有以下问题:我正在编写一个函数来查找一堆 .gz 文件,解压缩它们,并将单独解压缩的文件存储在更大的 .tar.gz 中 存档。到目前为止,我设法用下面的代码实现它,但手动计算未压缩的文件大小并设置
有没有办法读取 tar 文件格式的文件时间戳,以便为解压文件设置相同的时间。 例如:Tar 文件中有多个文件,我想读取一个文件的最后修改时间戳。 请查找下面使用的代码。 我正在使用 apache co
我需要在目录中找到所有 .gz 文件但不是 .tar.gz 文件,然后发送所有 。 gz 文件到 some_other_command 进行处理。 到目前为止我可以做到: 找到 . -regextyp
我的逐行读取文件的脚本如下, file= "/c/User/XXX/Desktop/XYZ.log" while IFS= read -r line do if echo $line | gr
我有一个 db.tar.gz 文件(大约 500mb),我正在使用 vagrant (unix) 终端解压缩该文件。 使用以下instructions在这里,我使用gunzip尝试使用下面的命令解压缩
我有一堆 filename.bz2.gz 的文件,我想将其转换为 filename.gz。 有什么帮助吗? 谢谢 最佳答案 有了您的文件名*.bz2.gz,我假设该文件是使用以下压缩顺序创建的: ec
我在 Linux 上有一个 250GB 的 gzip 文件,我想将它分成 250 个 1GB 的文件并即时压缩生成的部分文件(一旦生成一个文件,它就应该被压缩)。我试过用这个 - zcat file.
我制作了我的文件夹的两个压缩副本,首先使用命令 tar czf dir.tar.gz dir这给了我一个大小为 ~16kb 的存档。然后我尝试了另一种方法,首先我将所有文件压缩到目录中,然后使用 gz
是否有一种简单明了的方法来递归解压 war/ear/pack.gz/tar.gz 类型的嵌套文件,从而创建一个目录树 - war 中的耳朵等也如此? 我不在乎它是在标准 shell 中还是在 java
我正在尝试获取一个正则表达式(在 bash 中)来识别仅具有以下扩展名的文件: tgz、tar.gz、TGZ 和 TAR.GZ。 我尝试了几个但无法让它工作。 我使用此正则表达式来仅选择具有这些扩展名
我正在开发一个有关 UNIX 联机帮助页的项目,我意识到其中一些联机帮助页以 .1.gz 的形式成对存在。和.1posix.gz . 为什么有两个关于同一个实用程序的联机帮助页(我主要对第 1 部分感
我压缩了一个文件夹并在压缩时将其拆分为 200mb 的 tar.gz 文件。我怎样才能解压缩它们?有没有一种方法可以在一个命令中执行此操作,还是我必须分别执行每个命令? 最佳答案 您甚至不能单独进行。
我已经使用手动 gzip 手动压缩了我的 CSS,并且我正在尝试包含来自外部源的 css.gz。 " type="text/css" media="screen" /> 当我使用 PHP 和 Apac
我有一个命令可以从现有文件创建一个新的 .tar.gz 文件, sudo tar -zcvf Existing.tar.gz New.tar.gz 此命令将从现有的 Existing.tar.gz
目前,我有以/path_to_file/file.txt.gz 结尾的文件。 我想拆分提取文件名(在 .txt.gz 之前)。 x = os.path.basename("/path_to_file/
仅从字符串 89dde7.rqsnhq34h.fmu8s1vn0i94hl.tgz.tar.gz 中删除 .tar.gz 部分,结果应为 89dde7.rqsnhq34h.fmu8s1vn0i94hl
前几天开始下载了 http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz http://geoli
//, 这个问题有点模棱两可。 场景如下: 我有以下三个扩展名的日志,但我当前的规则仅适用于 *.log 文件: .1 .log .txt 另外,因为 Tomcat 正在轮换日志,所以我有以下内容:
详细说明, 我的 AWS S3 上有一个 tar.gz 文件,我们将其命名为 example.tar.gz。 所以,我想要做的是将 example.tar.gz 的提取内容下载到 /var/home/
我是一名优秀的程序员,十分优秀!