각각 크기가 약 3~10GB인 수천 개의 파일이 포함된 여러 폴더가 있습니다. 이제 이 파일들을 폴더로 패키징하고 싶습니다. 각 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에는 "--tape-length" 옵션을 사용할 때 모든 종류의 문제가 있습니다.
tarfile.ReadError: 예기치 않은 데이터 끝
(또한 Python을 사용하여 tar 아카이브의 가장자리에서 분할된 파일을 처리하고 싶습니다)
Linux에 이 문제에 대한 해결책이 있습니까? tar 대신 star를 찾았지만 아직 시도하지 않았습니다. 가능하면 표준 tar를 사용하는 것이 좋습니다.
답변1
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
답변2
내가 아는 한, Python은 tar 형식을 이해하지 못하므로 tar 아카이브 표준과 100% 호환되지 않는 tar 아카이브 모듈을 사용하는 것이 더 나을 수도 있습니다. 이것은 고려해야 할 중요한 사항입니다. 공식 기능 세트의 하위 집합만 지원하는 미완성 tar 구현이 많이 있습니다.
모드로 들어가지 않고 이 옵션을 사용하는 것이 좋습니다 star
. 이렇게 하면 파일이 중간에 분할되는 것을 방지할 수 있지만, 지정된 테이프 크기보다 큰 파일은 보관할 수 없습니다.-tsize
star
multi volume
star
기본 셸 "sh"가 "$((expr))" 지원에 있어서 POSIX 규격인 경우, 그렇지 않으면 "sh -c"를 "ksh -c" 또는 이와 유사한 것으로 바꾸십시오.
...어때요?
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 .
이렇게 하면 생성된 TAR 아카이브가 /tmp에 남게 됩니다. vol-last.tar의 이름을 최종 예상 볼륨 번호로 수동으로 바꿔야 합니다. 마지막 아카이브를 포함하여 모든 아카이브의 끝까지 새 볼륨 스크립트를 실행하도록 star를 향상시키는 것을 고려할 수 있습니다.