Antworten:
#!/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.
if [ $(stat -c '%s' "${filename}") == 0 ]; then rm "${filename}" fi
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.
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 dd
einen so großen bs
Parameter 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 50000
fü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}"
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.