Gibt es unter Linux Tools zum Teilen einer Datei?

16

Ich habe eine 500G-Datei, die ich unter Linux aufteilen möchte, aber ich habe keine weitere 500G zum Laufen frei split(1).

Gibt es ein Tool oder Skript, das die Datei direkt in 1G-Blöcke aufteilt und dabei nur minimalen zusätzlichen Speicherplatz verwendet?

ngoozeff
quelle

Antworten:

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 wurde nach dem Zerlegen und erneuten Zusammenbauen erfolgreich ausgeführt.

Whitequark
quelle
2
Beachten Sie, dass Sie 'dd if = / dev / null von = "$ {filename}" seek = 1 bs = $ (($ size - $ _size))' verwenden können, wenn Sie aus irgendeinem Grund nicht abgeschnitten haben
ngoozeff
1
Danke, Skript funktioniert super! Wenn etwas schief geht, möchten wir die Datei nicht löschen. Die letzte Zeile sollte lauten:if [ $(stat -c '%s' "${filename}") == 0 ]; then rm "${filename}" fi
Oleg Mikheev 31.12.14
Außerdem muss erwähnt werden, dass dieses Skript zusätzlichen Speicherplatz benötigt, der der Teilegröße entspricht (wenn Sie 500 GB in zwei Teile aufteilen, benötigen Sie 250 GB)
Oleg Mikheev,
Ich werde hinzufügen, dass bei der 10737418240Übergabe des Werts , dh 10 GB, fälschlicherweise 2 GB-Dateien erstellt wurden. Ich habe eine 300 GB-Datei geteilt und hatte 30 GB frei.
Xavier Leprêtre
3

Ich fand das @whitequark-Skript wirklich nützlich. Aber ich wollte ein 500-GB-Image in einige große Stücke von jeweils etwa 50 GB aufteilen. Auf diese Weise ist das Skript fehlgeschlagen, da es ddeinen so großen bsParameter nicht verarbeiten kann.

Also habe ich das Skript angepasst bs=1M, um Megabytes anstelle von Bytes zu erstellen und nach diesen zu fragen. Jetzt kann ich es in wirklich große Stücke aufteilen, zum Beispiel 50000für 50 GB.

#! / bin / bash
# (c) whitequark 2010
# (c) dertalai 2015 (minimale Änderungen)

set -e

if [$ #! = 2]; dann
  echo "Usage: $ 0"
  echo "Dieses Skript teilt die Datei in mehrere Teile auf, beginnend mit"
  Echo "das Ende und Abschneiden der Originaldatei in Bearbeitung."
  echo "Die Teilegröße wird in Megabyte angegeben (1 MB = 1048576 Byte)."
  echo "Benutzung auf eigene Gefahr."
  Ausfahrt 0
fi

Dateiname = $ 1
# partsize = $ 2
partsizeMB = $ 2
Teilegröße = $ (($ 2 * 1048576))

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

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

  echo "Teil teilen $ _teil"
  echo $ (($ partsize * ($ _part - 1))
  dd if = "$ {filename}" von = "$ {filename}. $ (printf '% 04d' $ _part)" \
      count = $ partsizeMB bs = 1M skip = $ ((($ _ part - 1) * $ partsizeMB))
  echo "Quelldatei abschneiden"
  "$ {filename}" kürzen --size = "- $ _ size"
}

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

für i in $ (seq $ parts -1 1); tun
  do_split $ i $ partsize
erledigt

rm "$ {filename}"
Dertalai
quelle
1

Hast du eigentlich schon die 500GB Datei? Wenn Sie eine 500-GB-Datei generieren, indem Sie einen Ordner oder eine Festplatte archivieren und dann versuchen, sie zu teilen, können Sie sie spontan teilen, indem Sie die Ausgabe von tar (oder was auch immer Sie verwenden) in split umwandeln:

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

Dadurch wird ein Archiv meiner Time Machine-Datenbank in DVD-Größe aufgeteilt. Es macht sie jedoch alle auf einmal, was bedeutet, dass es wirklich nicht das tut, wonach Sie suchen.

Siehe meine Frage hier für weitere Informationen. Das Skript von Whitequark könnte dort mit einigen geringfügigen Änderungen nützlich sein! Ich werde es versuchen müssen.

Kevin Vermeer
quelle