首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash脚本将大约1GB的文件打包到tar存档中

Bash脚本将大约1GB的文件打包到tar存档中
EN

Unix & Linux用户
提问于 2019-11-12 04:46:15
回答 2查看 394关注 0票数 0

我有几个文件夹和几千个文件,每个文件夹大约3-10 in的大小。现在,我想对文件夹中的这些文件进行解析,每个tar文件的大小应该大约为1GB。最后,我想使用Python来处理这些tar文件。

代码语言:javascript
复制
#!/bin/bash

dirlist=$(find $1 -mindepth 1 -maxdepth 1 -type d)
stored_date=$(date +%Y-%m-%d --date="-1 day")
#stored_date='2019-10-23'

for dir in $dirlist
do
(
    cd $dir
    tar_file=${PWD##*/}  
    tar_file="${tar_file}_${stored_date}.tar"

    echo "${tar_file}"

    tar -c $stored_date*.html --tape-length=1000M  -f ${tar_file}  --remove-files
)
done

它可以很好地创建1GB块,但是使用“--磁带-长度”选项,Python遇到了各种各样的问题

tarfile.ReadError:数据的意外结束

(另外:我也想使用Python处理在tar存档边缘分割的文件)

对此有Linux解决方案吗?我找到了星星而不是焦油,但我还没有试过--如果可能的话,我更愿意和标准的焦油呆在一起。

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2019-11-12 05:46:52

在每个目录循环中嵌套第二个循环以跟踪每个文件在追加到tar文件之前的大小如何?下面是我的意思的示意图伪代码:

代码语言:javascript
复制
max_size=$((1024*1024*1024))
total_size=0
for dir in $dirlist ; do
  for foo in $dir/*; do
    this_size="$(stat -c"%s" $foo)"
    if [ $(($total_size + $this_size)) -le $max_size ] ; then
      tar --append ... $foo
      total_size="$(($total_size + $this_size))"
    else
      # start new tar file here
      tar -c ... $foo
      total_size="$this_size"
    fi
  done
done
票数 1
EN

Unix & Linux用户

发布于 2019-11-13 11:16:38

AFAIK,python不理解tar格式,所以您可能喜欢使用与tar存档标准不完全兼容的tar存档模块。这是一件很重要的事情,有很多baken tar实现,它们通常只支持官方特性集的一个子集。

我建议使用star选项-tsize,而不将star带入multi volume模式。这样可以防止star在中间拆分文件,但它无法存档大于指定磁带大小的文件。

如果默认的shell "sh“与对"$((expr))”的支持兼容,则将"sh -c“替换为"ksh -c”或类似的。

...how关于:

代码语言:javascript
复制
cd /tmp
star -C path/to/archivedir -c tsize=1G \
new-volume-script='cd /tmp;sh -c "mv vol-last.tar vol\$((\$1-1)).tar" script' \
f=vol-last.tar .

这在/tmp中保存了创建的TAR存档。您需要手动将vol-last.tar重命名为最终预期的卷号。我可能会考虑增强star,将新的卷脚本运行到每个归档文件的末尾,包括最后一个。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/551670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档