क्या फाइल में जगह बनाने के लिए लिनक्स में कोई उपकरण हैं?


16

मेरे पास एक 500G फाइल है जिसे मैं linux में विभाजित करना चाहूंगा, लेकिन मेरे पास चलाने के लिए एक और 500G मुफ्त नहीं है split(1)

क्या कोई उपकरण या स्क्रिप्ट है जो न्यूनतम अतिरिक्त स्थान का उपयोग करते समय फ़ाइल को 1G विखंडू में विभाजित करेगा?

जवाबों:


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 सफलतापूर्वक चला है।


2
ध्यान दें कि आप 'dd if = / dev / null of = "$ {filename}" का उपयोग कर सकते हैं = तलाश करें = 1 bs = $ (($ size - $ _size))' यदि किसी कारण से आपके पास truncate
ngoozeff

1
धन्यवाद, स्क्रिप्ट बढ़िया काम करती है! अगर कुछ गलत हो जाता है तो हम फ़ाइल को हटाना नहीं चाहते हैं, अंतिम पंक्ति बेहतर होगी:if [ $(stat -c '%s' "${filename}") == 0 ]; then rm "${filename}" fi
ओलेग मिखेव

यह भी उल्लेख किया जाना चाहिए कि इस स्क्रिप्ट को अतिरिक्त स्थान की आवश्यकता है, जो कि भाग के आकार के बराबर है (यदि आप 500GB को दो टुकड़ों में तोड़ रहे हैं तो आपको 250GB की आवश्यकता होगी)
ओलेग मिखेव

मैं जोड़ूंगा कि जब मैंने मान पारित किया 10737418240, यानी 10GB, तो उसने गलत तरीके से 2GB फाइलें बनाईं। मैं एक 300GB फ़ाइल को विभाजित कर रहा था और 30GB मुफ्त था।
जेवियर लेप्रेट्रे

3

मुझे @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 "$ {फ़ाइल नाम}"

1

क्या आपके पास वास्तव में अभी तक 500GB फ़ाइल है? यदि आप किसी फ़ोल्डर या डिस्क को संग्रहित करके 500GB फ़ाइल उत्पन्न कर रहे हैं, और फिर इसे विभाजित करने का प्रयास कर रहे हैं, तो आप इसे टार-आउटपुट (या जो भी आप उपयोग कर रहे हैं) के विभाजन में विभाजित करके इसे ऑन-द-फ्लाई में विभाजित कर सकते हैं:

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

यह मेरे टाइम मशीन डेटाबेस के एक संग्रह के डीवीडी-आकार के विभाजन बना देगा। हालाँकि, यह उन सभी को एक ही बार में बनाता है, जिसका अर्थ है कि यह वास्तव में वह नहीं करता है जो आप खोज रहे हैं।

अधिक जानकारी के लिए यहां मेरा प्रश्न देखें । श्वेतार्क की स्क्रिप्ट कुछ मामूली संशोधन के साथ वहाँ पर उपयोगी हो सकती है! मुझे इसकी कोशिश करनी होगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.