উত্তর:
#!/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}"
জেডিট সফলভাবে তা ছড়িয়ে দেওয়ার এবং আবার একত্রিত করার পরে চলেছে।
if [ $(stat -c '%s' "${filename}") == 0 ]; then rm "${filename}" fi
10737418240
অর্থাৎ 10 জিবি পাস করেছি তখন এটি ভুলভাবে 2 জিবি ফাইল তৈরি করেছে। আমি 300 জিবি ফাইলটি বিভক্ত করছিলাম এবং 30 জিবি ফ্রি ছিল।
আমি @ হোয়াইটুয়ার্ক স্ক্রিপ্টটি সত্যিই দরকারী বলে খুঁজে পেয়েছি। তবে আমি প্রায় 500 গিগাবাইটের কয়েকটি বড় অংশে 500 গিগাবাইটের ডিস্ক চিত্রকে বিভক্ত করতে চেয়েছিলাম। এইভাবে, স্ক্রিপ্টটি ব্যর্থ হয়েছে, যেহেতু dd
এত বড় bs
পরামিতি পরিচালনা করতে পারে না ।
তাই আমি bs=1M
বাইটের পরিবর্তে মেগাবাইট তৈরি এবং জিজ্ঞাসা করার জন্য স্ক্রিপ্টটি কাস্টমাইজ করেছি । এখন আমি জায়গায় এবং সত্যিই বড় অংশগুলিতে বিভক্ত করতে পারি, উদাহরণস্বরূপ, 50000
50 গিগাবাইটের জন্য।
#! / বিন / ব্যাশ # (গ) হোয়াইটকোয়ার্ক ২০১০ # (সি) ডার্টলাই 2015 (নূন্যতম পরিবর্তন) সেট -ই যদি [$ #! = 2]; তারপর প্রতিধ্বনি "ব্যবহার: $ 0" প্রতিধ্বনি "এই স্ক্রিপ্টটি ফাইলটি একাধিক অংশে বিভক্ত করবে, থেকে শুরু করে" "শেষটি প্রতিধ্বনি করুন এবং প্রক্রিয়াতে আসল ফাইলটি কেটে ফেলা"। প্রতিধ্বনি "অংশের আকার মেগাবাইটে নির্দিষ্ট করা হয়েছে (1 এমবি = 1048576 বাইট)" প্রতিধ্বনি "আপনার নিজের ঝুঁকিতে ব্যবহার করুন।" প্রস্থান 0 ফাই ফাইলের নাম = $ 1 # Partsize = $ 2 partsizeMB = $ 2 পার্টসাইজ = $ (($ 2 * 1048576)) আকার = $ (স্ট্যাটাস-সি '% s' "$ {ফাইলের নাম}") অংশ = $ (($ আকার / $ পার্টসাইজ)) do_split () { _part = $ 1 _size = $ 2 প্রতিধ্বনি "বিভক্ত অংশ $ _ অংশ" প্রতিধ্বনি $ (($ পার্টসাইজ * ($ _ পার্ট - 1))) dd যদি = "$ {ফাইলের নাম of" এর = "$ {ফাইলের নাম}" $ (প্রিন্টফ '% 04d' $ _ অংশ) "\ গণনা = $ পার্টসাইজ এমবি বিএস = 1 এম এড়িয়ে যান = $ ((($ _ অংশ - 1) * $ পার্টসাইজ এমবি)) প্রতিধ্বনিত "উত্স ফাইল কাটা" "$ {ফাইলের নাম}" - আকার = "- size _ আকার" কেটে দিন } স্থায়ী হয় = $ (($ আকার% $ পার্সেসাইজ)) যদি [sts স্থায়ী হয়! = 0]; তারপর do_split $ (($ অংশগুলি + 1)) sts স্থায়ী হয় ফাই আমি $ (seq $ অংশ -1 1) এ; করা do_split $ i $ পার্টসাইজ করুন সম্পন্ন আরএম "$ {ফাইলের নাম}"
আপনার কাছে এখনও 500 জিবি ফাইল আছে? যদি আপনি কোনও ফোল্ডার বা ডিস্ক সংরক্ষণাগার করে 500 জিবি ফাইল তৈরি করে থাকেন এবং তারপরে এটি বিভক্ত করার চেষ্টা করেন, আপনি তারের আউটপুট (বা আপনি যা কিছু ব্যবহার করছেন) বিভক্ত করে পাইপ করে অন-ফ্লাইকে বিভক্ত করতে পারেন:
sudo tar cvjsp /Volumes/BackupDisk/Backups.backupdb/ | \
split -d -b 4480m - Backups.backupdb.tar.bz2.
এটি আমার টাইম মেশিন ডাটাবেসের একটি সংরক্ষণাগার ডিভিডি আকারের বিভক্ত করবে। যাইহোক, এটি সমস্ত একবারে করে তোলে, যার অর্থ এটি যা আপনি খুঁজছেন তা সত্যিই তা করে না।
আরও তথ্যের জন্য আমার প্রশ্ন এখানে দেখুন। কিছুটা সংশোধন করে হোয়াইটক্কার্কের স্ক্রিপ্টটি সেখানে কার্যকর হতে পারে! আমি এটি চেষ্টা করতে হবে।