Unix에서 특정 제한사항이 있는 파일 백업

Unix에서 특정 제한사항이 있는 파일 백업

시나리오는 다음과 같습니다. 폴더에 1000개의 파일이 있고 각 파일의 크기는 약 3MB입니다. 모든 파일을 각 zip당 50MB로 압축하고 원본 파일을 삭제하고 싶습니다.

노트:50MB에는 20개의 파일 또는 10개의 파일이 포함될 수 있지만 zip은 50MB 이하여야 합니다.

데이터 손실 없이 이 파일을 전송하고 싶습니다. 파일은 (tar/gzip/bzip) 형식이어야 합니다. 데이터 손실을 극복할 수 있는 다른 방법이 있다면 제게 제안해 주세요.

쉘 스크립트를 작성해야 합니다.

답변1

한 가지 해결책은 분할 명령을 사용하는 것입니다.

분할 명령은 아카이브를 여러 파일로 분할하여 모든 어려운 작업을 수행합니다.

예는 다음과 같습니다.

tar -cvf - file1 file2 file3 | split --bytes=50m --suffix-length=4 --numeric-suffix - myarchive.tar.

그리고 압축을 푼다:

cat myarchive.tar.* | tar xvf -

답변2

zip제품군은 다음을 지원합니다.압축 패키지 2압축 및 --split.

bzip2가 귀하의 요구 사항을 충족합니까?

-s 분할 크기 --split-size 분할 크기 분할 아카이브 생성을 활성화하고 분할 크기를 설정합니다. 분할 아카이브는 여러 파일로 분할할 수 있는 아카이브입니다. 아카이브 생성 시 아카이브의 크기가 지정된 분할 크기에 도달하면 분할이 닫히고 다음 분할이 열립니다.

...

분할 크기는 숫자입니다(선택적으로 승수가 뒤에 올 수 있음). 현재 숫자는 정수여야 합니다. 승수는 현재 k(킬로바이트), m(메가바이트), g(기가바이트) 또는 t(테라바이트) 중 하나일 수 있습니다. 64k가 최소 분할 크기이므로 승수가 없는 숫자는 기본적으로 메가바이트입니다. 예를 들어, 분할 크기가 670MB이고 CD를 굽는 데 유용할 수 있는 bar 디렉토리의 내용을 포함하는 foo라는 분할 아카이브를 생성하려면 다음 명령을 실행하십시오.

zip -s 670m -r foo 바

로 사용할 수 있습니다.

데이터 무결성을 보장하기 위해 rsync체크섬 확인이 있습니다. 훨씬 느리지만 전송 양쪽에서 체크섬을 계산합니다.

-c, --체크섬

이는 rsync가 파일이 변경되었는지, 전송해야 하는지 확인하는 방식을 변경합니다. 이 옵션이 없으면 rsync는 lqquick checkrq(기본값)를 사용하여 보낸 사람과 받는 사람 사이의 각 파일 크기와 마지막 수정 시간이 일치하는지 확인합니다. 이 옵션은 각 파일의 128비트 체크섬을 일치하는 크기와 비교하도록 이 설정을 변경합니다. 체크섬을 생성한다는 것은 양 당사자가 전송 중인 파일의 모든 데이터를 읽는 데 많은 디스크 I/O를 소비한다는 것을 의미하므로(변경된 파일을 전송할 때 읽기가 수행되기 전) 작업 속도가 크게 느려질 수 있습니다.

에서:man zip,man rsync

답변3

테스트되지 않은

cd /the/directory
files=(*)
i=0
z=0
create_zip=true
for ((i=0; i<${#files[@]}; i++)); do
    if $create_zip; then
        ((z++))
        zip_file=prefix.$z.zip
        create_zip=false
    fi
    # add the file
    zip $zip_file "${files[i]}"
    # check the size
    if (( $(stat -c %s $zip_file) >= 50000000 )); then
        # remove the previous file
        zip -d $zip_file "${files[i]}"
        create_zip=true
        # decrement the file index so this file gets added to the next zip
        ((i--))
    else
        echo rm "${files[i]}"            ### remove "echo" if it's OK
    fi
done

관련 정보