มีเครื่องมือใดใน linux ที่ใช้สำหรับแยกไฟล์หรือไม่?


16

ผมมีไฟล์ 500G ที่ผมอยากจะแบ่งออกเป็นลินุกซ์ แต่ฉันไม่ได้มี 500G split(1)อีกฟรีสำหรับการทำงาน

มีเครื่องมือหรือสคริปต์ที่จะแบ่งไฟล์ในตำแหน่งเป็น 1G ชิ้นในขณะที่ใช้พื้นที่พิเศษน้อยที่สุด?

คำตอบ:


13
#!/bin/bash
# (c) whitequark 2010

set -e

if [ $# != 2 ]; then
  echo "Usage: $0 <filename> <part size>"
  echo "  This script will split file to multiple parts, starting from"
  echo "  the end, and truncating the original file in process."
  echo "  Part size is specified in bytes."
  echo "  Use at your own risk."
  exit 0
fi

filename=$1
partsize=$2

size=$(stat -c '%s' "${filename}")
parts=$(($size / $partsize))

do_split() {
  _part=$1
  _size=$2

  echo "Splitting part $_part"
  echo $(($partsize * ($_part - 1)))
  dd if="${filename}" of="${filename}.$(printf '%04d' $_part)" \
      count=1 bs=$partsize skip=$(($_part - 1))
  echo "Truncating source file"
  truncate "${filename}" --size="-$_size"
}

lastsize=$(($size % $partsize))
if [ $lastsize != 0 ]; then
  do_split $(($parts + 1)) $lastsize
fi

for i in $(seq $parts -1 1); do
  do_split $i $partsize
done

rm "${filename}"

gedit ประสบความสำเร็จในการรันหลังจากแยกชิ้นส่วนแล้วประกอบอีกครั้ง


2
โปรดทราบว่าคุณสามารถใช้ 'dd if = / dev / null ของ = "$ {filename}" แสวงหา = 1 bs = $ (($ ขนาด - $ _size))' ถ้าด้วยเหตุผลบางอย่างที่คุณไม่มีการตัดทอน
ngoozeff

1
ขอบคุณสคริปต์ใช้งานได้ดี! หากมีข้อผิดพลาดเราไม่ต้องการลบไฟล์ให้บรรทัดสุดท้ายดีกว่า:if [ $(stat -c '%s' "${filename}") == 0 ]; then rm "${filename}" fi
Oleg Mikheev

นอกจากนี้จะต้องมีการกล่าวถึงว่าสคริปต์นี้ต้องใช้พื้นที่เพิ่มเติมซึ่งเท่ากับขนาดชิ้นส่วน (ถ้าคุณแบ่ง 500GB เป็นสองชิ้นคุณจะต้อง 250GB)
Oleg Mikheev

ฉันจะเพิ่มว่าเมื่อฉันผ่านค่า10737418240เช่น 10GB มันสร้างไฟล์ 2GB ผิด ฉันแบ่งไฟล์ 300GB และมี 30GB ฟรี
Xavier Leprêtre

3

ฉันพบว่า @whitequark script มีประโยชน์จริงๆ แต่ฉันต้องการแบ่งดิสก์อิมเมจขนาด 500GB ให้เป็นชิ้นขนาดใหญ่ประมาณ 50GB ต่อชิ้น ด้วยวิธีนี้สคริปต์ล้มเหลวเนื่องจากddไม่สามารถจัดการbsพารามิเตอร์ขนาดใหญ่ได้

ดังนั้นฉันจึงปรับแต่งสคริปต์สำหรับการสร้างbs=1Mและขอเมกะไบต์แทนที่จะเป็นไบต์ ตอนนี้ฉันสามารถแยกชิ้นส่วนและชิ้นใหญ่ ๆ ที่ใช้งานเช่น5000050GB

#! / bin / ทุบตี
# (c) whitequark 2010
# (c) dertalai 2015 (แก้ไขน้อยที่สุด)

ชุด -e

ถ้า [$ #! = 2]; แล้วก็
  echo "การใช้งาน: $ 0"
  echo "สคริปต์นี้จะแบ่งไฟล์เป็นหลายส่วนโดยเริ่มจาก"
  echo "จุดสิ้นสุดและตัดทอนไฟล์ต้นฉบับที่อยู่ระหว่างดำเนินการ"
  echo "ระบุขนาดชิ้นงานเป็นเมกะไบต์ (1 MB = 1048576 ไบต์)"
  echo "ใช้ความเสี่ยงของคุณเอง"
  ออก 0
Fi

ชื่อไฟล์ = $ 1
# partsize = $ 2
partsizeMB = $ 2
partsize = $ (($ 2 * 1048576))

ขนาด = $ (stat -c '% s' "$ {filename}")
ส่วน = $ (($ ขนาด / $ ชิ้นส่วน))

do_split () {
  _part = $ 1
  _size = $ 2

  echo "แยกส่วน $ _part"
  echo $ (($ partsize * ($ _part - 1)))
  dd if = "$ {filename}" ของ = "$ {filename}. $ (printf '% 04d' $ _part)" \
      count = $ partsizeMB bs = 1M ข้าม = $ (((ส่วนที่ _ $ - 1) * $ partsizeMB))
  echo "การตัดทอนซอร์สไฟล์"
  ตัดทอน "$ {filename}" --size = "- $ _ size"
}

lastsize = $ (($ ขนาด% $ ชิ้นส่วน))
ถ้า [$ lastsize! = 0]; แล้วก็
  do_split $ (($ ชิ้นส่วน + 1)) $ lastsize
Fi

สำหรับ i ใน $ (seq $ parts -1 1); ทำ
  do_split $ i $ ชิ้นส่วน
เสร็จแล้ว

rm "$ {filename}"

1

คุณมีไฟล์ 500GB หรือไม่ หากคุณกำลังสร้างไฟล์ 500GB โดยการเก็บถาวรโฟลเดอร์หรือดิสก์จากนั้นพยายามแยกไฟล์คุณสามารถแบ่งไฟล์แบบทันทีโดยการวาง pip ของ output ของ tar (หรืออะไรก็ตามที่คุณใช้) แบ่งเป็น:

sudo tar cvjsp /Volumes/BackupDisk/Backups.backupdb/ | \
     split -d -b 4480m - Backups.backupdb.tar.bz2.

สิ่งนี้จะทำให้การแยกเก็บถาวรขนาด DVD ของฐานข้อมูล Time Machine ของฉัน อย่างไรก็ตามมันทำให้พวกเขาทั้งหมดในครั้งเดียวซึ่งหมายความว่ามันไม่ได้ทำสิ่งที่คุณกำลังมองหา

ดูคำถามของฉันที่นี่สำหรับข้อมูลเพิ่มเติม สคริปต์ของ Whitequark อาจมีประโยชน์ตรงนั้นพร้อมการดัดแปลงเล็กน้อย! ฉันจะต้องลองดู

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.