Ci sono strumenti in Linux per dividere un file in atto?


16

Ho un file 500G che vorrei dividere in Linux, ma non ho altri 500G gratuiti per l'esecuzione split(1).

Esiste uno strumento o uno script che suddividerà il file sul posto in blocchi 1G usando uno spazio aggiuntivo minimo?

Risposte:


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 ha funzionato correttamente dopo averlo smontato e rimontato.


2
nota che puoi usare 'dd if = / dev / null of = "$ {nomefile}" seek = 1 bs = $ (($ size - $ _size))' se per qualche motivo non hai troncato
ngoozeff

1
Grazie, la sceneggiatura funziona alla grande! Se qualcosa va storto non vogliamo cancellare il file, l'ultima riga dovrebbe essere:if [ $(stat -c '%s' "${filename}") == 0 ]; then rm "${filename}" fi
Oleg Mikheev,

Inoltre, è necessario ricordare che questo script richiede spazio aggiuntivo, che equivale alla dimensione della parte (se stai rompendo 500 GB in due pezzi, avrai bisogno di 250 GB)
Oleg Mikheev,

Aggiungerò che quando ho superato il valore 10737418240, ovvero 10 GB, ha creato erroneamente file da 2 GB. Stavo dividendo un file da 300 GB e avevo 30 GB gratuiti.
Xavier Leprêtre,

3

Ho trovato lo script @whitequark davvero utile. Ma volevo dividere un'immagine del disco da 500 GB in alcuni grossi pezzi di circa 50 GB ciascuno. In questo modo, lo script non è riuscito, poiché ddnon è in grado di gestire un bsparametro così grande .

Quindi ho personalizzato lo script per creare bs=1Me chiedere megabyte anziché byte. Ora posso dividere sul posto e in pezzi davvero grandi usando, ad esempio, 50000per 50 GB.

#! / Bin / bash
# (c) whitequark 2010
# (c) dertalai 2015 (modifiche minime)

set -e

if [$ #! = 2]; poi
  echo "Utilizzo: $ 0"
  echo "Questo script divide il file in più parti, a partire da"
  echo "alla fine e troncando il file originale in corso."
  echo "La dimensione della parte è specificata in megabyte (1 MB = 1048576 byte)."
  echo "Utilizzare a proprio rischio."
  uscita 0
fi

filename = $ 1
# PartSize = $ 2
partsizeMB = $ 2
partsize = $ (($ 2 * 1048576))

size = $ (stat -c '% s' "$ {nome file}")
parti = $ (($ size / $ partsize))

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

  echo "Divisione parte $ _part"
  echo $ (($ partsize * ($ _part - 1)))
  dd if = "$ {nomefile}" di = "$ {nomefile}. $ (printf '% 04d' $ _part)" \
      count = $ partsizeMB bs = 1M skip = $ (((($ _ part - 1) * $ partsizeMB))
  echo "Troncamento del file sorgente"
  troncare "$ {nomefile}" --size = "- $ _ size"
}

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

per i in $ (seq $ parti -1 1); fare
  do_split $ i $ partsize
fatto

rm "$ {nome file}"

1

Hai già il file da 500 GB? Se stai generando un file da 500 GB archiviando una cartella o un disco e quindi provando a dividerlo, puoi dividerlo al volo reindirizzando l'output di tar (o qualunque cosa tu stia utilizzando) in split:

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

Questo renderà suddivisioni in dimensioni DVD di un archivio del mio database di Time machine. Tuttavia, li rende tutti in una volta, il che significa che non fa davvero quello che stai cercando.

Vedi la mia domanda qui per maggiori informazioni. La sceneggiatura di Whitequark potrebbe essere utile laggiù con qualche leggera modifica! Dovrò provarlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.