जवाबों:
#!/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 सफलतापूर्वक चला है।
if [ $(stat -c '%s' "${filename}") == 0 ]; then rm "${filename}" fi
10737418240, यानी 10GB, तो उसने गलत तरीके से 2GB फाइलें बनाईं। मैं एक 300GB फ़ाइल को विभाजित कर रहा था और 30GB मुफ्त था।
मुझे @whitequark स्क्रिप्ट वास्तव में उपयोगी लगी। लेकिन मैं 500GB डिस्क छवि को लगभग 50GB के कुछ बड़े हिस्से में विभाजित करना चाहता था। इस तरह, स्क्रिप्ट विफल हो गई, क्योंकि ddइतने बड़े bsपैरामीटर को संभाल नहीं सकते ।
इसलिए मैंने bs=1Mबाइट्स के बजाय मेगाबाइट बनाने और मांगने की स्क्रिप्ट को कस्टमाइज़ किया । अब मैं जगह में और वास्तव में बड़ी मात्रा में विभाजित कर सकता हूं, उदाहरण के लिए, 5000050GB के लिए।
#! / Bin / bash
# (c) श्वेतार्क 2010
# (c) डर्टलाई 2015 (न्यूनतम संशोधन)
सेट
अगर [$ #! = 2]; फिर
प्रतिध्वनि "उपयोग: $ 0"
इको "यह स्क्रिप्ट फ़ाइल को कई भागों में विभाजित करेगी, जिससे शुरू होगी"
गूंज "अंत में, और प्रक्रिया में मूल फ़ाइल को छोटा करना।"
इको "भाग का आकार मेगाबाइट (1 एमबी = 1048576 बाइट्स) में निर्दिष्ट है।"
गूंज "अपने जोखिम पर उपयोग करें।"
बाहर निकलें 0
फाई
फ़ाइल नाम = $ 1
# Partsize = $ 2
partsizeMB = $ 2
partize = $ (($ 2 * 1048576))
आकार = $ (स्टेट-सी '% s' "$ {फ़ाइल नाम}")
भागों = $ (($ आकार / $ भागों में))
do_split () {
_part = $ 1
_size = $ 2
इको "स्प्लिटिंग पार्ट $ _part"
इको $ (($ पार्टिसाइज़ * ($ _part - 1)))
dd if = "$ {filename}" = "$ {filename}। $ (printf '% 04d' $ _part)" \
गिनती = $ partizeMB bs = 1M स्किप = $ ((($ _ part - 1) * $ partizeMB)
गूंज "स्रोत फ़ाइल को काट रहा है"
truncate "$ {फ़ाइल नाम}" - आकार = "- $ _ आकार"
}
lastsize = $ (($ size% $ partize))
अगर [$ रहता है! = 0]; फिर
do_split $ (($ parts + 1)) $ lastsize
फाई
के लिए मैं $ में (seq $ भागों -1 1); कर
do_split $ i $ partize
किया हुआ
rm "$ {फ़ाइल नाम}"
क्या आपके पास वास्तव में अभी तक 500GB फ़ाइल है? यदि आप किसी फ़ोल्डर या डिस्क को संग्रहित करके 500GB फ़ाइल उत्पन्न कर रहे हैं, और फिर इसे विभाजित करने का प्रयास कर रहे हैं, तो आप इसे टार-आउटपुट (या जो भी आप उपयोग कर रहे हैं) के विभाजन में विभाजित करके इसे ऑन-द-फ्लाई में विभाजित कर सकते हैं:
sudo tar cvjsp /Volumes/BackupDisk/Backups.backupdb/ | \
split -d -b 4480m - Backups.backupdb.tar.bz2.
यह मेरे टाइम मशीन डेटाबेस के एक संग्रह के डीवीडी-आकार के विभाजन बना देगा। हालाँकि, यह उन सभी को एक ही बार में बनाता है, जिसका अर्थ है कि यह वास्तव में वह नहीं करता है जो आप खोज रहे हैं।
अधिक जानकारी के लिए यहां मेरा प्रश्न देखें । श्वेतार्क की स्क्रिप्ट कुछ मामूली संशोधन के साथ वहाँ पर उपयोगी हो सकती है! मुझे इसकी कोशिश करनी होगी।