জায়গায় কোনও ফাইল বিভক্ত করার জন্য কি লিনাক্সের কোনও সরঞ্জাম রয়েছে?


16

আমার কাছে একটি 500 জি ফাইল রয়েছে যা আমি লিনাক্সে বিভক্ত করতে চাই, তবে চলার জন্য আমার কাছে আরও 500 জি ফ্রি নেই 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}"

জেডিট সফলভাবে তা ছড়িয়ে দেওয়ার এবং আবার একত্রিত করার পরে চলেছে।


2
নোট আপনি ব্যবহার করতে পারেন যে 'DD যদি = আপনার / dev / = এর নাল "$ {ফাইলের নাম}" চাইতে = 1 BS = $ (($ আকার - $ _size))' যদি কোনো কারণে আপনি আরোপ করা হবে না
ngoozeff

1
ধন্যবাদ, স্ক্রিপ্ট দুর্দান্ত কাজ করে! যদি কিছু ভুল হয় আমরা ফাইলটি মুছতে চাই না, শেষ লাইনটি আরও ভাল হবে:if [ $(stat -c '%s' "${filename}") == 0 ]; then rm "${filename}" fi
ওলেগ মিখিভ

এছাড়াও এটি উল্লেখ করা দরকার যে এই স্ক্রিপ্টটিতে অতিরিক্ত স্থানের প্রয়োজন হয় যা অংশের আকারের সমান (যদি আপনি 500 গিগাবাইট দুটি টুকরো করে ভাবেন আপনার 250 গিগাবাইট প্রয়োজন হবে)
ওলেগ মিখিভ

আমি যুক্ত করব যে আমি যখন মানটি 10737418240অর্থাৎ 10 জিবি পাস করেছি তখন এটি ভুলভাবে 2 জিবি ফাইল তৈরি করেছে। আমি 300 জিবি ফাইলটি বিভক্ত করছিলাম এবং 30 জিবি ফ্রি ছিল।
জাভিয়ার লেপ্রিট্রে

3

আমি @ হোয়াইটুয়ার্ক স্ক্রিপ্টটি সত্যিই দরকারী বলে খুঁজে পেয়েছি। তবে আমি প্রায় 500 গিগাবাইটের কয়েকটি বড় অংশে 500 গিগাবাইটের ডিস্ক চিত্রকে বিভক্ত করতে চেয়েছিলাম। এইভাবে, স্ক্রিপ্টটি ব্যর্থ হয়েছে, যেহেতু ddএত বড় bsপরামিতি পরিচালনা করতে পারে না ।

তাই আমি bs=1Mবাইটের পরিবর্তে মেগাবাইট তৈরি এবং জিজ্ঞাসা করার জন্য স্ক্রিপ্টটি কাস্টমাইজ করেছি । এখন আমি জায়গায় এবং সত্যিই বড় অংশগুলিতে বিভক্ত করতে পারি, উদাহরণস্বরূপ, 5000050 গিগাবাইটের জন্য।

#! / বিন / ব্যাশ
# (গ) হোয়াইটকোয়ার্ক ২০১০
# (সি) ডার্টলাই 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 $ পার্টসাইজ করুন
সম্পন্ন

আরএম "$ {ফাইলের নাম}"

1

আপনার কাছে এখনও 500 জিবি ফাইল আছে? যদি আপনি কোনও ফোল্ডার বা ডিস্ক সংরক্ষণাগার করে 500 জিবি ফাইল তৈরি করে থাকেন এবং তারপরে এটি বিভক্ত করার চেষ্টা করেন, আপনি তারের আউটপুট (বা আপনি যা কিছু ব্যবহার করছেন) বিভক্ত করে পাইপ করে অন-ফ্লাইকে বিভক্ত করতে পারেন:

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

এটি আমার টাইম মেশিন ডাটাবেসের একটি সংরক্ষণাগার ডিভিডি আকারের বিভক্ত করবে। যাইহোক, এটি সমস্ত একবারে করে তোলে, যার অর্থ এটি যা আপনি খুঁজছেন তা সত্যিই তা করে না।

আরও তথ্যের জন্য আমার প্রশ্ন এখানে দেখুন। কিছুটা সংশোধন করে হোয়াইটক্কার্কের স্ক্রিপ্টটি সেখানে কার্যকর হতে পারে! আমি এটি চেষ্টা করতে হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.