আকারের সীমা সহ একাধিক আর্কাইভগুলিতে অনেকগুলি অনুরূপ আকারের ফাইল কীভাবে ট্যারিডজ করতে হয়


11

আমি উবুন্টু 16.04 এ আছি।

আমার কাছে অনেকগুলি পাঠ্য ফাইল (প্রায় 12 কে) সহ একটি ফোল্ডার রয়েছে। আমাকে সেগুলিকে একটি ওয়েবসাইটে আপলোড করতে হবে যা .tar.gzআপলোডগুলি গ্রহণ করে এবং সেগুলি স্বয়ংক্রিয়ভাবে সেগুলি সংক্রামিত করে, তবে প্রতি ফাইলের সীমা 10MB (10000KB) থাকে (তাই বিশেষত প্রতিটি ফাইলের নিজস্ব নিজেই সংক্ষেপণ করতে হয়)। আমি যদি tar.gzএই সমস্ত ফাইলগুলিতে ফলাফল পাই তবে প্রায় 72MB এর ফাইল হয়।

আমি যা করতে চাই তা হ'ল আটটি .tar.gzফাইল তৈরি করা, প্রতিটি আকার / মাত্রা (কঠোরভাবে) 10000KB এর চেয়ে ছোট।

বিকল্পভাবে, কেউ ধরে নিতে পারেন যে উপরের সমস্ত ফাইলের প্রায় একই মাত্রা রয়েছে, তাই আমি .tar.gzপ্রতিটিতে কম বেশি কম পরিমাণে একই পরিমাণে আটটি ফাইল তৈরি করতে চাই ।

আমি এই দুটি কাজগুলির মধ্যে কোনটি কীভাবে করতে পারি?

জিইআইআই, সিএলআই বা স্ক্রিপ্টিং জড়িত এমন একটি সমাধানের সাথে আমি পুরোপুরি ভাল। আমি এখানে গতি খুঁজছি না, আমার কেবল এটি করা দরকার।


সম্ভবত আপনার কাছে থাকা 12 কে ফাইলগুলির নামগুলিতে নিদর্শন বা পুনরাবৃত্তি অক্ষর থাকবে। আপনার tarসবগুলি না হওয়া পর্যন্ত আপনি সম্ভবত নির্দিষ্ট প্যাটার্ন দিয়ে শুরু করা সমস্ত ফাইল যুক্ত করে এগুলি করতে পারেন। এটি সহজে স্ক্রিপ্ট করা যেতে পারে তবে আপনার প্রয়োজন মতো আকারটি 9MB এর চেয়ে কম হবে এর গ্যারান্টি দেয় না। তবে, আপনি ম্যানুয়ালি সেই ফাইলগুলির আকারকে আরও বিভক্ত করে আকারে সামঞ্জস্য করতে পারেন।
জুয়ান আন্তোনিও

উত্তর:


9

সম্পূর্ণ প্যাচওয়ার্ক এবং একটি দ্রুত, রুক্ষ স্কেচ যেমনটি রয়েছে তবে 3000 ফাইলের সাহায্যে ডিরেক্টরিতে এটি পরীক্ষা করা হয়েছে, নীচের স্ক্রিপ্টটি অত্যন্ত দ্রুত কাজ করেছে:

#!/usr/bin/env python3
import subprocess
import os
import sys

splitinto = 2

dr = sys.argv[1]
os.chdir(dr)

files = os.listdir(dr)
n_files = len(files)
size = n_files // splitinto

def compress(tar, files):
    command = ["tar", "-zcvf", "tarfile" + str(tar) + ".tar.gz", "-T", "-", "--null"]
    proc = subprocess.Popen(command, stdin=subprocess.PIPE)
    with proc:
        proc.stdin.write(b'\0'.join(map(str.encode, files)))
        proc.stdin.write(b'\0')
    if proc.returncode:
        sys.exit(proc.returncode)

sub = []; tar = 1
for f in files:
    sub.append(f)
    if len(sub) == size:
        compress(tar, sub)
        sub = []; tar += 1

if sub:
    # taking care of left
    compress(tar, sub)

কিভাবে ব্যবহার করে

  • এটিকে খালি ফাইলে সংরক্ষণ করুন compress_split.py
  • প্রধান বিভাগে, সংক্ষেপে ফাইলগুলির সংখ্যা নির্ধারণ করুন। অনুশীলনে, বাকি কয়েকটি "বাম ওভার" রক্ষণাবেক্ষণের জন্য সর্বদা আরও একটি থাকবে।
  • আপনার ফাইলগুলির সাথে এটি যুক্তি হিসাবে ডিরেক্টরিতে চালান:

    python3 /path/tocompress_split.py /directory/with/files/tocompress

সংখ্যাযুক্ত .tar.gzফাইলগুলি যেখানে ফাইল রয়েছে সেই একই ডিরেক্টরিতে তৈরি করা হবে।

ব্যাখ্যা

এই পান্ডুলিপি:

  • ডিরেক্টরিতে সমস্ত ফাইল তালিকাভুক্ত করে
  • টার ফাইলটিতে পথের তথ্য যোগ করা রোধ করতে ডিরেক্টরিতে সিডি
  • ফাইল তালিকার মাধ্যমে সেট বিভাগ দ্বারা তাদেরকে গ্রুপবদ্ধ করে পড়া হয়
  • সাব গ্রুপ (গুলি) কে সংখ্যাযুক্ত ফাইলগুলিতে সংকুচিত করে

সম্পাদনা

এমবি আকারে স্বয়ংক্রিয়ভাবে খণ্ডগুলি তৈরি করুন

আরও পরিশীলিত হ'ল অংশগুলির সর্বোচ্চ আকার (এমবিতে) একটি (দ্বিতীয়) যুক্তি হিসাবে ব্যবহার করা। নীচের স্ক্রিপ্টে, অংশগুলি একটি সংকুচিত ফাইলে লেখা হবে যতক্ষণ না খণ্ডটি দ্বার প্রান্তে পৌঁছে যাবে।

যেহেতু স্ক্রিপ্টটি খণ্ডগুলি দ্বারা ট্রিগার করা হয়েছে, প্রান্তিক ছাড়িয়েছে, এটি তখনই কাজ করবে যদি (সমস্ত) ফাইলের আকার খণ্ড আকারের চেয়ে যথেষ্ট ছোট হয়।

এই পান্ডুলিপি:

#!/usr/bin/env python3
import subprocess
import os
import sys

dr = sys.argv[1]
chunksize = float(sys.argv[2])
os.chdir(dr)

files = os.listdir(dr)
n_files = len(files)

def compress(tar, files):
    command = ["tar", "-zcvf", "tarfile" + str(tar) + ".tar.gz", "-T", "-", "--null"]
    proc = subprocess.Popen(command, stdin=subprocess.PIPE)
    with proc:
        proc.stdin.write(b'\0'.join(map(str.encode, files)))
        proc.stdin.write(b'\0')
    if proc.returncode:
        sys.exit(proc.returncode)

sub = []; tar = 1; subsize = 0
for f in files:
    sub.append(f)
    subsize = subsize + (os.path.getsize(f)/1000000)
    if subsize >= chunksize:
        compress(tar, sub)
        sub = []; tar += 1; subsize = 0

if sub:
    # taking care of left
    compress(tar, sub)

চালানোর জন্য:

python3 /path/tocompress_split.py /directory/with/files/tocompress chunksize

... যেখানে চুনসাইজ হ'ল টার কমান্ডের ইনপুট আকার ।

এটির মধ্যে @ ডেভিডফোস্টার দ্বারা প্রস্তাবিত উন্নতিগুলি অন্তর্ভুক্ত করা হয়েছে। অনেক অনেক ধন্যবাদ !


@ dadexix86 স্বাগতম!
জ্যাকব Vlijm

আমি theশ্বরের শেল আহ্বান থেকে মুক্তি পেয়েছি এবং সরাসরি একটি যুক্তি তালিকা ব্যবহার করেছি। তবুও, বড় আর্গুমেন্টের তালিকা সমস্যাযুক্ত হতে পারে এবং আমি tarস্ট্যান্ডার্ড ইনপুট স্ট্রিমে ফাইল তালিকা সরবরাহ করে আরও অনুরোধটি আরও উন্নত করার চেষ্টা করব try
ডেভিড ফোস্টার

হাই @ ডেভিডফোস্টার, আমি আপনার অন্তর্দৃষ্টি বিশ্বাস করি, তবে কী লাভ?
জ্যাকব Vlijm

বেশিরভাগ রানটাইম এনভায়রনমেন্টের একটি কমান্ডের আর্গুমেন্ট স্ট্রিংয়ের মোট দৈর্ঘ্যের উপর একটি (নরম এবং শক্ত) সীমা থাকে যা আপনি হাজার হাজার ফাইলগুলিতে অপারেটিং করার সময় দ্রুত পৌঁছে যাবেন। এজন্য tarআপনাকে উপযুক্ত বিকল্পের সাহায্যে স্ট্যান্ডার্ড ইনপুটটিতে ফাইলগুলি যুক্ত করতে (বা এক্সট্রাক্ট করতে) নির্দিষ্ট করতে পারবেন।
ডেভিড ফোস্টার

@ ডেভিডফোস্টার একটি সমস্যা আছে যদিও, দ্বিতীয়টি আর চালায় না। আসলে তাদের
দু'জনই

6

একটি খাঁটি শেল পদ্ধতির:

files=(*); 
num=$((${#files[@]}/8));
k=1
for ((i=0; i<${#files[@]}; i+=$num)); do 
    tar cvzf files$k.tgz -- "${files[@]:$i:$num}"
    ((k++))
done

ব্যাখ্যা

  • files=(*): অ্যারের মধ্যে ফাইলগুলির তালিকা (যদি ডিরেক্টরি উপস্থিত থাকে তবে files=(*.txt)কেবল একটি txtএক্সটেনশান সহ জিনিসগুলি পেতে পরিবর্তন করুন ) সংরক্ষণ করুন $files
  • num=$((${#files[@]}/8));: ${#files[@]}অ্যারেতে উপাদানগুলির সংখ্যা $files$(( ))ব্যাশ এর (সীমিত) গাণিতিক করছেন উপায়। সুতরাং, এই কমান্ডটি $num8 দ্বারা বিভক্ত ফাইলের সংখ্যা নির্ধারণ করে।
  • k=1 : কেবল টার্বলগুলির নাম দেওয়ার জন্য একটি কাউন্টার।
  • for ((i=0; i<${#files[@]}; i+=$num)); do: অ্যারের মানগুলি নিয়ে পুনরাবৃত্তি করুন। (অ্যারের প্রথম উপাদান) $iএ আরম্ভ করা হয় 0এবং দ্বারা বর্ধিত হয় $num। এটি অব্যাহত থাকে যতক্ষণ না আমরা সমস্ত উপাদান (ফাইলগুলি) না পেরে।
  • tar cvzf files$i.tgz -- ${files[@]:$i:$num}: ব্যাশে, আপনি একটি অ্যারের স্লাইস (অ্যারের অংশ) ব্যবহার করে পেতে পারেন ${array[@]:start:length}, সুতরাং ${array[@]:2:3}দ্বিতীয় থেকে শুরু করে তিনটি উপাদান ফিরে আসবে। এখানে, আমরা একটি স্লাইস নিচ্ছি যা বর্তমান মান থেকে শুরু হয় $iএবং $numউপাদানগুলি দীর্ঘ। --ক্ষেত্রে প্রয়োজন হয় আপনার ফাইলের নাম কোন একটি দিয়ে শুরু করতে পারেন -
  • ((k++)) : বৃদ্ধি $k

নিস! আমি প্রথমবার ব্যাশের অ্যারে সূচক ব্যাপ্তির ব্যবহারিক ব্যবহার দেখেছি।
জো

খুব পরিষ্কার এবং সংক্ষিপ্ত। আমার কাছে পাইথন সমাধানের চেয়ে বেশি বোধগম্য যদিও উভয়ই বেশ ভাল pretty তারা সকলেই পারফর্মেন্সের সাথে কীভাবে তুলনা করবেন?
ডকসালভ্যাজার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.