Apakah ada alat di linux untuk memisahkan file?

16

Saya memiliki file 500G yang ingin saya bagi di linux, tapi saya tidak punya 500G gratis untuk dijalankan split(1).

Apakah ada alat atau skrip yang akan membagi file di tempat menjadi potongan 1G saat menggunakan ruang ekstra minimal?

ngoozeff
sumber

Jawaban:

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 telah berhasil dijalankan setelah membongkar dan merakitnya lagi.

whitequark
sumber
2
perhatikan bahwa Anda dapat menggunakan 'dd if = / dev / null of = "$ {filename}" seek = 1 bs = $ (($ size - $ _size))' jika karena alasan tertentu Anda tidak memiliki truncate
ngoozeff
1
Terima kasih, skrip bekerja dengan baik! Jika ada yang tidak beres, kami tidak ingin menghapus file, baris terakhir sebaiknya:if [ $(stat -c '%s' "${filename}") == 0 ]; then rm "${filename}" fi
Oleg Mikheev
Juga perlu disebutkan bahwa skrip ini memang membutuhkan ruang tambahan, yang sama dengan ukuran bagian (jika Anda memecah 500GB menjadi dua bagian Anda akan membutuhkan 250GB)
Oleg Mikheev
Saya akan menambahkan bahwa ketika saya melewati nilai 10737418240, yaitu 10GB, itu salah membuat file 2GB. Saya membagi file 300GB dan memiliki 30GB gratis.
Xavier LeprĂȘtre
3

Saya menemukan skrip @whitequark sangat berguna. Tapi saya ingin membagi disk image 500GB menjadi beberapa potongan besar masing-masing sekitar 50GB. Dengan cara ini, skrip gagal, karena ddtidak dapat menangani bsparameter sebesar itu .

Jadi saya mengkustomisasi skrip untuk membuat bs=1Mdan meminta megabita alih-alih byte. Sekarang saya dapat membagi di tempat dan di potongan sangat besar menggunakan, misalnya, 50000untuk 50GB.

#! / bin / bash
# (c) whitequark 2010
# (c) dertalai 2015 (modifikasi minimal)

set -e

if [$ #! = 2]; kemudian
  echo "Penggunaan: $ 0"
  echo "Script ini akan membagi file menjadi beberapa bagian, mulai dari"
  gema "akhir, dan memotong file asli dalam proses."
  echo "Ukuran bagian ditentukan dalam megabyte (1 MB = 1048576 byte)."
  gema "Gunakan dengan risiko Anda sendiri."
  keluar 0
fi

nama file = $ 1
# partsize = $ 2
partsizeMB = $ 2
partsize = $ (($ 2 * 1048576))

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

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

  echo "Membagi bagian $ _part"
  echo $ (($ partsize * ($ _part - 1)))
  dd if = "$ {filename}" of = "$ {filename}. $ (printf '% 04d' $ _part)" \
      count = $ partsizeMB bs = 1M skip = $ ((($ _ part - 1) * $ partsizeMB))
  gema "Memotong file sumber"
  truncate "$ {filename}" --size = "- $ _ size"
}

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

untuk saya dalam $ (seq $ bagian -1 1); melakukan
  do_split $ i $ partsize
selesai

rm "$ {nama file}"
Dertalai
sumber
1

Apakah Anda sebenarnya sudah memiliki file 500GB? Jika Anda menghasilkan file 500GB dengan mengarsipkan folder atau disk, dan kemudian mencoba membaginya, Anda dapat membaginya secara langsung dengan memiparkan output tar (atau apa pun yang Anda gunakan) ke dalam split:

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

Ini akan membuat arsip DVD berukuran terpisah dari basis data Time Machine saya. Namun, itu membuat semuanya sekaligus, yang berarti benar-benar tidak melakukan apa yang Anda cari.

Lihat pertanyaan saya di sini untuk info lebih lanjut. Skrip Whitequark bisa berguna di sana dengan sedikit modifikasi! Saya harus mencobanya.

Kevin Vermeer
sumber