Python

將大約 1GB 的文件打包到 tar 存檔中的 Bash 腳本

  • November 13, 2019

我有幾個包含數千個文件的文件夾,每個文件夾的大小大約為 3-10GB。現在,我想對文件夾中的這些文件進行 tar,每個 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 塊 - 但是使用“–tape-length”選項,Python 遇到了各種各樣的問題

tarfile.ReadError:數據意外結束

(加:我也想使用 Python 處理文件,這些文件被分割在 tar 檔案的邊緣)

有Linux解決方案嗎?我找到了 star 而不是 tar 但還沒有嘗試過——如果可能的話,我更願意使用標準的 tar。

如何在每個目錄循環中嵌套第二個循環以跟踪每個文件的大小,然後再將其附加到 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

引用自:https://unix.stackexchange.com/questions/551670