我有几个文件夹和几千个文件,每个文件夹大约3-10 in的大小。现在,我想对文件夹中的这些文件进行解析,每个tar文件的大小应该大约为1GB。最后,我想使用Python来处理这些tar文件。
#!/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解决方案吗?我找到了星星而不是焦油,但我还没有试过--如果可能的话,我更愿意和标准的焦油呆在一起。
发布于 2019-11-12 05:46:52
在每个目录循环中嵌套第二个循环以跟踪每个文件在追加到tar文件之前的大小如何?下面是我的意思的示意图伪代码:
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发布于 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关于:
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,将新的卷脚本运行到每个归档文件的末尾,包括最后一个。
https://unix.stackexchange.com/questions/551670
复制相似问题