จะสร้างไฟล์เก็บถาวรแบบแยกในหลายขั้นตอนเพื่อประหยัดพื้นที่ได้อย่างไร

Jan 08 2021

ฉันมีโฟลเดอร์ขนาดใหญ่มากที่ฉันพยายามสร้างไฟล์เก็บถาวรของ tar ปัญหาคือฉันไม่มีพื้นที่ว่างมากพอที่จะจัดเก็บที่เก็บถาวรทั้งหมดดังนั้นฉันจึงต้องการสร้างที่เก็บถาวรขนาด 100-200GB พร้อมกันและถ่ายโอนทีละรายการไปยังที่เก็บข้อมูลบนคลาวด์ ฉันต้องสามารถควบคุมได้เมื่อสร้างชิ้นส่วนใหม่ดังนั้น HDD ของฉันจึงไม่เต็ม แต่คำสั่งทั้งหมดที่ฉันพบในการสร้าง tarballs แบบแยกมักจะสร้างทั้งหมดพร้อมกันในไดเร็กทอรีเดียวกัน

วิธีแก้ปัญหาที่ใกล้เคียงที่สุดที่ฉันพบมาจากคำถามนี้แต่การตอบกลับทั้งหมดใช้ฐานข้อมูลที่เก็บถาวรตามจำนวนไฟล์ไม่ใช่ขนาดที่สำคัญสำหรับกรณีการใช้งานของฉันเนื่องจากขนาดไฟล์ของฉันกระจายไม่สม่ำเสมอ

คำตอบ

2 EduardoTrápani Jan 08 2021 at 10:09

คุณสามารถใช้tarด้วยตัวเลือกเหล่านี้:

--new-volume-script=COMMAND
--tape-length=N

ในตอนท้ายของแต่ละโวลุ่มจะเรียกสคริปต์ของคุณซึ่งจะมีตัวแปรสภาพแวดล้อมบางอย่างเพื่อให้ทราบว่าไดรฟ์ข้อมูลใดเพิ่งถูกประมวลผล ตรวจสอบหน้าคู่มือสำหรับรายการทั้งหมด แต่อย่างน้อยตัวแปร TAR_VOLUME ก็มีประโยชน์มากในกรณีที่คุณต้องเปลี่ยนชื่อไฟล์เอาต์พุตหรือติดตามไดรฟ์ข้อมูลปัจจุบัน:

TAR_VOLUME หมายเลขลำดับของวอลุ่ม tar กำลังประมวลผล (ตั้งค่าหากอ่านไฟล์เก็บถาวรแบบหลายไดรฟ์ข้อมูล)

หากการส่งคืนสคริปต์0 tarจะดำเนินต่อไปมิฉะนั้นจะหยุดลง

ตัวอย่างเช่นสิ่งนี้จะสร้างแต่ละโวลุ่มโดยมีขนาดสูงสุด 20M เรียกสคริปต์ของคุณทุกครั้งที่ถึงขีด จำกัด :

tar cvf /tmp/volume.tar /path/to/files/ --new-volume-script=/path/to/myscript.sh --tape-length=20M

สคริปต์อาจเป็นแบบธรรมดาecho "Next volume";readหรือคุณสามารถทำการถ่ายโอนได้ (เปลี่ยนชื่อโวลุ่มเนื่องจากเมื่อคุณออก/tmp/volume.tarจะถูกเขียนทับ)

ในอีกด้านหนึ่งให้แน่ใจว่าได้ใช้แฟล็ก - หลายไดรฟ์ข้อมูล หากคุณไม่ทำเช่นนั้น tar จะหยุดด้วยข้อผิดพลาด (ฉันปล่อยไว้ในกรณีที่มีคนค้นหาข้อผิดพลาด):

tar: EOF ที่ไม่คาดคิดในไฟล์เก็บถาวร

tar: ข้อผิดพลาดไม่สามารถกู้คืนได้: กำลังออกตอนนี้

tar xvf /path/to/transferred.volume --multi-volume

เตรียมโวลุ่ม # 2 สำหรับ /path/to/transferred.volume และตีกลับ:

tarจะแจ้งให้คุณใช้โวลุ่มใหม่ เมื่อคุณกด Enter /path/to/transferred.volumeจะเปิดขึ้นอีกครั้งและอื่น ๆ

1 JoshHarrison Jan 09 2021 at 01:30

ติดตามคำตอบที่ยอดเยี่ยมของ eduardo-trápaniด้านล่างนี้เป็นเวอร์ชันที่แก้ไขเล็กน้อยของสคริปต์ที่พบในหน้า GNUซึ่งรอการป้อนข้อมูลของผู้ใช้สำหรับแต่ละโวลุ่มและลองใหม่หากไม่พบไดรฟ์ข้อมูล:

เพื่อความสมบูรณ์นี่คือคำสั่งที่ใช้สร้างไฟล์เก็บถาวร:

tar cvf /tmp/volume.tar /path/to/files/ --new-volume-script=./myscript.sh --tape-length=1000M

และนี่คือคำสั่งที่ฉันใช้ในการแยกไฟล์เก็บถาวร:

tar xvf /tmp/volume.tar --multi-volume --new-volume-script=./myscript.sh

myscript.sh:

#!/bin/bash
# For this script it's advisable to use a shell, such as Bash,
# that supports a TAR_FD value greater than 9.

echo "Press enter to continue to next volume"

read

echo Preparing volume $TAR_VOLUME of $TAR_ARCHIVE.

name=`expr $TAR_ARCHIVE : '\(.*\)-.*'` case $TAR_SUBCOMMAND in
-c)       ;;
-d|-x|-t) test -r ${name:-$TAR_ARCHIVE}-$TAR_VOLUME || echo "Failed to find volume" ;; *) exit 1 esac echo ${name:-$TAR_ARCHIVE}-$TAR_VOLUME >&$TAR_FD

แก้ไข: ใช้ได้เฉพาะกับ GNU Tar ซึ่งสามารถติดตั้งบน macOS (w / Homebrew) โดย:

brew install gnu-tar

ในการใช้เป็น tar เริ่มต้นของคุณคุณจะต้องเพิ่มลงในเส้นทางของคุณดังนี้:

export PATH="$(brew --prefix)/opt/python/libexec/bin:$PATH"