বৃহত ডিরেক্টরি গাছকে নির্দিষ্ট আকারের অংশগুলিতে বিভক্ত করা হচ্ছে?


11

আমার একটি ডিরেক্টরি ট্রি রয়েছে যা আমি অপটিকাল ডিস্কগুলিতে ব্যাক আপ করতে চাই। দুর্ভাগ্যক্রমে, এটি কোনও একটি ডিস্কের আকার ছাড়িয়েছে (এটি প্রায় 60 গিগাবাইট)। আমি এমন একটি স্ক্রিপ্ট খুঁজছি যা এই গাছটিকে যথাযথ আকারের ভাগগুলিতে শক্ত লিঙ্কগুলি বা হোয়াট নোটে ভাগ করে দেবে (মূলটি ছোঁয়া ছাড়বে)। আমি তখন এই কামড়ের আকারের গাছগুলিকে ব্যাকআপ প্রক্রিয়াতে খাওয়াতে পারি (পিএআর 2 রিডানডেন্সি ইত্যাদি যুক্ত করুন)।

এটি কোনও অভিনব স্ক্রিপ্ট নয়, তবে মনে হচ্ছে এটি ইতিমধ্যে সম্পন্ন হয়েছে। পরামর্শ?

(এক ধাপে বিস্তৃত হওয়া এবং লেখানো কোনও উপায় নয় কারণ আমি ফাইলগুলি পোড়া হওয়ার আগে আরও বেশি জিনিস করতে চাই))


আপনি কি নীল লেখক হওয়ার কথা বিবেচনা করেছেন?
বিএসডি

2
ডিভিডি মিডিয়া অবিশ্বাস্য ... আমি কোনও বাহ্যিক ড্রাইভ, কার্বোনাইটের মতো একটি অনলাইন ব্যাকআপ বা মিডিয়া বার্ন করার ক্ষেত্রে কিছুটা par2সুরক্ষা ব্যবহার করার পরামর্শ দেব ।
অ্যারন ডি ম্যারাস্কো

উত্তর:


7

এর জন্য ডিজাইন করা একটি অ্যাপ্লিকেশন রয়েছে: dirsplit

এটি সাধারণত cdrkitবা dirsplitপ্যাকেজগুলিতে থাকে।

এটি সহজেই কে 3 বি বা অন্যান্য জিইউআই সফ্টওয়্যার দিয়ে ডিভিডি তৈরি করতে লিংক সহ ব্যবহারের জন্য প্রস্তুত ফোল্ডার তৈরি করতে পারে


এটি সত্যিই ভাল কাজ করেছে। উবুন্টুতে আমি এটি genisoimageপ্যাকেজে পেয়েছি ।
21:38


2

আমি একবার একই উদ্দেশ্যে একটি কদর্য স্ক্রিপ্ট তৈরি করেছি। এটি কেবল একটি ক্লডজ, তবে আমি যখন এটি লিখেছিলাম তখন আমি মৃত্যুদন্ড কার্যকর করার সময় বা প্রাকদৃষ্টির বিষয়ে চিন্তা করতাম না। আমি নিশ্চিত যে চারপাশে একই ধারণার আরও "উত্পাদিত" সংস্করণ রয়েছে তবে আপনি যদি হ্যাকিং শুরু করতে কিছু ধারণা বা কিছু পেতে চান তবে এখানে যান (এটি ২০০৮ সালে হয়েছিল, তাই নিজের ঝুঁকিতে ব্যবহার করুন!): - )

#!/bin/sh -
REPO=/export/foton/PictureStore
LINKS=/export/foton/links
SPLITTIX=`date '+%y%m%d-%H%M'`

# kilobytes
DVDSIZE=4400000
PARTPREFIX="DVD-"
REPOSIZE=`du -sk -- ${REPO} | awk '{print $1}'`
NUMPARTS=`expr $REPOSIZE / $DVDSIZE`
SPLITDIR=${LINKS}/splits/${SPLITTIX}
mkdir -p -- "$SPLITDIR"

PARTNUM=1
PARTSIZ=0
DONESIZ=0
PARTNUM=`echo $PARTNUM | awk '{printf("%03x", $0)}'`
mkdir -p -- "${SPLITDIR}/${PARTPREFIX}${PARTNUM}"
for D in "${REPO}"/..?* "${REPO}"/.[!.]* "${REPO}"/*
do
  if [ ! -e "$D" ]; then continue; fi  # skip ..?*, .[!.]* and * if there are no matching files
  D=${D#$REPO/}
  D_SIZ=`du -sk -- "${REPO}/$D" | awk '{print $1}'`
  if test `expr $D_SIZ + $PARTSIZ` -le $DVDSIZE
  then
    # link to D in this part
    ln -s -- "$REPO/$D" "${SPLITDIR}/${PARTPREFIX}${PARTNUM}/$D"
    # adjust counters
    PARTSIZ=`expr $PARTSIZ + $D_SIZ`
    DONESIZ=`expr $DONESIZ + $D_SIZ`
  else
    # next part and link to D in that
    echo PART $PARTNUM: $PARTSIZ kb '(target' $DVDSIZE 'kb)'
    PARTNUM=`expr $PARTNUM + 1`
    PARTNUM=`echo $PARTNUM | awk '{printf("%03x", $0)}'`
    PARTSIZ=$D_SIZ
    DONESIZ=`expr $DONESIZ + $D_SIZ`
    mkdir -p -- "${SPLITDIR}/${PARTPREFIX}${PARTNUM}"
    ln -s -- "$REPO/$D" "${SPLITDIR}/${PARTPREFIX}${PARTNUM}/$D"
  fi
done
echo "wrote $DONESIZ kb in $PARTNUM parts in $SPLITDIR"

আমি মনে করি আমি সাম্বার মাধ্যমে ফলাফলটি একটি উইন্ডো হোস্টের সাথে ভাগ করেছিলাম যা এখান থেকে ডিস্ক বার করে দিয়েছিল। আপনি যদি উপরে বর্ণহীন অপরিবর্তিত ব্যবহার করেন তবে আপনি mkisofsবা অন্য প্রত্নতাত্ত্বিক ব্যবহার করতে পারেন যা সিমলিংকগুলি সমাধান করে।


ফাইলের নামগুলিতে (সাদা স্থান, প্রাথমিক ড্যাশ এবং বিন্দু, \[?*) বিশেষ অক্ষরগুলির সাথে মানিয়ে নিতে আমি আপনার স্ক্রিপ্টে কিছু পরিবর্তন করেছি । প্রস্তাবিত পাঠ্য: ls , $ VAR বনাম {{VAR of এর আউটপুটকে বিশ্লেষণ করবেন না এবং উদ্ধৃত করুন বা উদ্ধৃত করবেন না । মনে রাখবেন যে আমি ফলাফলের স্ক্রিপ্টটি পরীক্ষা করি নি। আপনি যদি আমার একটি পরিবর্তন বুঝতে না পারেন তবে নির্দ্বিধায় জিজ্ঞাসা করুন।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

@ গিলস: ২০০৮ সাল থেকে আমি প্রচুর পঠন করেছি ;-) স্ক্রিপ্টটিকে আরও জেনেরিক করার পরিবর্তনগুলি ভাল। ( যদিও এর [বিপরীতে আমার পরিচিতি অপছন্দ হয়েছে test) ...
ম্যাটবিয়ানকো

আপনার সেই বেশিরভাগ ভেরিয়েবলের কেস কম করা উচিত। কনভেনশন দ্বারা, আমরা এনভায়রনমেন্ট ভেরিয়েবল (PAGER, EDITOR, SHELL, ...) এবং অভ্যন্তরীণ শেল ভেরিয়েবলকে মূলধন করি। অন্যান্য সমস্ত পরিবর্তনশীল নামের কমপক্ষে একটি ছোট হাতের অক্ষর থাকা উচিত। এই কনভেনশনটি দুর্ঘটনাক্রমে পরিবেশগত এবং অভ্যন্তরীণ ভেরিয়েবলগুলি অগ্রাহ্য করে avo
ক্রিস ডাউন

2

অনুরূপ সমস্যা সমাধানের জন্য আমি একবার স্ক্রিপ্ট লিখেছিলাম - আমি এটিকে "বিতরণ" বলেছিলাম (আপনি স্ক্রিপ্টের মূল কোডটি বা সহায়তা বার্তার সাহায্যে ফাইলটি পড়তে পারেন বা এটি প্যাকেজ হিসাবে ডাউনলোড করতে পারেন ); এর বর্ণনা থেকে :

বিতরণ - একাধিক সিডিতে প্যাকেজগুলির সংগ্রহ বিতরণ করুন (বিশেষত এপিটির সাথে ভবিষ্যতে ব্যবহারের জন্য ভাল)

বর্ণনা: 'বিতরণ' প্রোগ্রাম প্যাকেজ সংগ্রহের বিতরণের জন্য সিডি সেট তৈরি সম্পর্কিত কাজগুলি সহজ করে তোলে। কার্যগুলির মধ্যে রয়েছে: সিডি ফাইল সিস্টেম স্থাপন (বৃহত পরিমাণ প্যাকেজগুলিকে বিভিন্ন ডিস্কে বিভক্ত করা ইত্যাদি), এপিটি (সূচক) দ্বারা ব্যবহারের জন্য সংগ্রহ প্রস্তুত করা, আইএসও চিত্র তৈরি করা এবং ডিস্ক রেকর্ড করা।

প্রাথমিকভাবে বিতরণ সংগ্রহে পর্যায়ক্রমিক আপডেটগুলি 'বিতরণ' এর সাহায্যে জারি করা যেতে পারে।

এটি পুরো প্রক্রিয়াটি বেশ কয়েকটি পর্যায়ে সম্পাদন করে: এক পর্যায়ে এটি ফুরুর ডিস্ককে "লেআউটগুলি" মূল ফাইলগুলিতে সিমলিংক ব্যবহার করে তৈরি করে - যাতে আপনি হস্তক্ষেপ করতে পারেন এবং ভবিষ্যতের ডিস্ক গাছগুলি পরিবর্তন করতে পারেন।

স্ক্রিপ্ট দ্বারা মুদ্রিত সহায়তা বার্তায় (বা উত্স কোডটি দেখে) এর ব্যবহার সম্পর্কে বিশদটি পড়তে পারেন।

এটি আরও কৌশলযুক্ত ব্যবহারের ক্ষেত্রে মাথায় রেখে লেখা হয়েছিল (মূলত রেকর্ড করা ফাইলগুলির সংগ্রহের ক্ষেত্রে "আলাদা" হিসাবে আপডেটগুলি সংযোজন করা), সুতরাং এতে একটি অতিরিক্ত প্রাথমিক পর্যায় অন্তর্ভুক্ত রয়েছে, "ফিক্সিং" "ফাইল সংগ্রহের বর্তমান অবস্থা (সরলতার জন্য, এটি সিমলিংকের মাধ্যমে ফাইলের মূল সংগ্রহের প্রতিলিপি করে এটি সংগ্রহের রাজ্যগুলি সংরক্ষণের জন্য একটি বিশেষ কার্যকারী জায়গায়; তারপরে, ভবিষ্যতে কিছু সময়, এটি ভবিষ্যতে ফাইল সংগ্রহের এই বর্তমান অবস্থা এবং এই সংরক্ষিত অবস্থার মধ্যে পার্থক্য তৈরি করতে সক্ষম হবে)। সুতরাং, যদিও আপনার এই বৈশিষ্ট্যটির প্রয়োজন নাও থাকতে পারে তবে আপনি এই প্রাথমিক পর্যায়ে এফআইআর ছাড়তে পারবেন না।

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

এপিটি-সম্পর্কিত স্টাফগুলি isচ্ছিক, সুতরাং এটির প্রয়োজন হয় না যদি এটি আপনার প্রয়োজন না হয় তবে এপিটি দ্বারা ব্যবহৃত প্যাকেজ সংগ্রহগুলি প্রস্তুত করতে পারে।

আপনি যদি আগ্রহী হন তবে অবশ্যই এটি আপনার প্রয়োজনে নতুন করে লিখতে বা উন্নতির পরামর্শ দিন।

(দয়া করে মনোযোগ দিন যে প্যাকেজটিতে উপস্থাপিত গিট রেপোতে উপস্থাপিত কোড তালিকায় প্রয়োগ করা হয়নি এমন অতিরিক্ত দরকারী প্যাচগুলি অন্তর্ভুক্ত রয়েছে!)


আমি - অন্যান্য অনেকগুলি বিষয় উপস্থাপন করেছি - এর কোড সং अंश distributeযা এখানে জিজ্ঞাসা করা প্রয়োজনীয় কাজটি সমাধান করে।
ইম্জ - ইভান জাখারিয়াচেভ

2

আমাদের ভুলে যাওয়া উচিত নয় যে কার্যটির সারমর্মটি আসলেই বেশ সহজ; হাস্কেলের উপর একটি টিউটোরিয়াল হিসাবে দেওয়া হয়েছে (যা এই কাজের সমাধানের মধ্য দিয়ে লেখা হয়েছে, ক্রমবর্ধমান সংশোধন করা হয়েছে)

এখন আসুন এক মুহুর্তের জন্য আমাদের প্রোগ্রামটি কীভাবে সিউডোকোডে এটি পরিচালনা করবে এবং প্রকাশ করবে:

main = Read list of directories and their sizes.
       Decide how to fit them on CD-Rs.
       Print solution.

যুক্তিসঙ্গত মনে হচ্ছে? আমিও তাই ভাবছিলাম.

আসুন আমরা আমাদের জীবনকে কিছুটা সহজ করি এবং এখনই ধরে নিই যে আমরা আমাদের প্রোগ্রামের বাইরে কোথাও ডিরেক্টরি আকারগুলি গণনা করব (উদাহরণস্বরূপ, " du -sb *" সহ) এবং স্টিডিন থেকে এই তথ্যটি পড়ব read

( হাইচিকার্স থেকে হাস্কেল গাইড, অধ্যায় 1 )

(অ্যাডিশালি, আপনার প্রশ্নে, আপনি ফলস্বরূপ ডিস্ক লেআউটগুলি টুইঙ্ক করতে (সম্পাদনা করতে এবং তার বার্ন করার জন্য একটি সরঞ্জাম ব্যবহার করতে সক্ষম হতে চান) use)

আপনার ফাইল সংগ্রহ বিভক্ত করার জন্য সেই হাস্কেল টিউটোরিয়াল থেকে আপনি প্রোগ্রামটির একটি সহজ রূপটি পুনরায় ব্যবহার (অভিযোজিত এবং পুনরায় ব্যবহার) করতে পারেন।

দুর্ভাগ্যবশত, এ টুল যে আমি এখানে অন্য উত্তর উল্লেখিত থাকেন , অপরিহার্য বিভাজন টাস্ক সরলতা জটিলতা এবং ব্যবহারকারি ইন্টারফেসের bloatedness মেলে না হয় (কারণ বেশ কর্ম একত্রিত লেখা হয়েছিল; যদিও পর্যায়ে সম্পাদিত, তবে এখনও আমি যেভাবে পরিষ্কারভাবে ভাবতে পারি তার সাথে মিলিত হয়নি)।distributedistribute

আপনাকে এর কোডটি কিছুটা ব্যবহার করতে সহায়তা করতে, এখানে distribute( 380 লাইনে থাকা ) বাশ-কোডের একটি অংশ যা ফাইলগুলির সংগ্রহকে বিভক্ত করার এই "প্রয়োজনীয়" কাজটি সম্পাদন করে:

# Splitting:

function splitMirrorDir() {
  if [[ ! -d "$THIS_BASES_DIR/$BASE/$type" ]]; then
    echo $"No base fixed for $type" >&2
    exit 1
  fi

  # Getting the list of all suitable files:
  local -a allFiles
  let 'no = 0' ||:
  allFiles=()
  # no points to the next free position in allFiles
  # allFiles contains the constructed list
  for p in "$THIS_BASES_DIR/$BASE/$type"/*.rpm; do
      if [[ ! -e "$p" ]]; then
      # fail on non-existent files
      echo $"Package file doesn't exist: " "$p" >&2
      return 1 
      fi
      if [[ "$ONLY_REAL_FILES" == "yes" && ! -f "$p" ]]; then
      continue
      fi
      if [[ "$DIFF_TO_BASE" ]]; then
          older_copy="$DIFF_TO_BASE/$type/${p##*/}" # using shell param expansion instead of `basename' to speed up
          if [[ -h "$older_copy" || -a "$older_copy" ]]; then
          continue
      fi
      fi
      allFiles[$(( no++ ))]="$p"
  done
  readonly -a allFiles

  # Splitting the list of all files into future disks:
  # 
  local -a filesToEat allSizes
  let 'no = 0' ||:
  filesToEat=()
  allSizes=($(getSize "${allFiles[@]}"))
  readonly -a allSizes
  # allSizes contains the sizes corrsponding to allFiles
  # filesToEat hold the constructed list of files to put on the current disk
  # no points to the next free position in filesToEat
  # totalSize should hold the sum of the sizes 
  #  of the files already put into filesToEat;
  #  it is set and reset externally.
  for p in "${allFiles[@]}"; do 
      if (( totalsize + ${allSizes[$(( no ))]} > CDVOLUME )); then
      eatFiles "${filesToEat[@]}"
          filesToEat=()
          finishCD
      startTypedCD
    fi
      let "totalsize += ${allSizes[$(( no ))]}" ||:
      filesToEat[$(( no++ ))]="$p"
  done
  eatFiles "${filesToEat[@]}"
}

function eatFiles() {
    #{ oldIFS="$IFS"; IFS=$'\n'; echo "$FUNCNAME: args: " "$*" | head >&2;  IFS="$oldIFS"; }
    zeroDelimited "$@" | xargs -0 --no-run-if-empty \
    cp -s \
    --target-dir="$THIS_LAYOUTS_DIR/cd$(( cdN ))/$PREFIX/$type$DOT_SUFFIX"/ \
    --
}

function startTypedCD() {
#  set -x
  mkdir -p "$THIS_LAYOUTS_DIR/cd$(( cdN ))/$PREFIX/$type$DOT_SUFFIX"
  start_action $" %s with %s" "$(( cdN ))" "$type"
#  set +x
}

function finishCD() {

( 454 লাইনের পরে আরও পড়ুন )

নোট করুন যে eatFilesফাংশনটি ভবিষ্যতের ডিস্কগুলির লেআউটগুলি গাছ হিসাবে তৈরি করে যেখানে পাতাগুলি আসল ফাইলগুলির সাথে প্রতিচ্ছবিযুক্ত। সুতরাং, এটি আপনার প্রয়োজনীয়তা পূরণ করছে যে আপনার জ্বলনের আগে লেআউটগুলি সম্পাদনা করতে সক্ষম হওয়া উচিত। mkisofsউপযোগ যা প্রকৃতপক্ষে এর কোডে নিযুক্ত করা হয় symlinks অনুসরণ করার জন্য একটি বিকল্প আছে, আমার mkisoফাংশন

উপস্থাপিত স্ক্রিপ্ট (যা আপনি নিজের প্রয়োজনে আবার নিতে ও লিখতে পারেন, অবশ্যই!) সহজ ধারণাটি অনুসরণ করে: ফাইলগুলির আকারের (বা আরও সুনির্দিষ্টভাবে প্যাকেজগুলির ক্ষেত্রে distribute) কেবলমাত্র তাদের তালিকাভুক্ত করা হয়েছে তা যোগ করতে, ডন কোনও পুনর্বিন্যাস করবেন না।

"হাইচাইকার্সকে হাস্কেলের গাইড" অপ্টিমাইজেশান সমস্যাটিকে আরও গুরুত্ব সহকারে নিয়েছে এবং প্রোগ্রামের রূপগুলির পরামর্শ দেয় যা ডিস্কগুলিতে আরও ভাল ফিট করার জন্য (এবং কম ডিস্কের প্রয়োজন হয়) যাতে ফাইলগুলি স্মার্টলি পুনরায় সাজানোর চেষ্টা করবে:

ইতিমধ্যে যথেষ্ট প্রিলিমিনারি রয়েছে। আসুন কিছু সিডি প্যাক করা যাক।

আপনি ইতিমধ্যে স্বীকৃত হতে পারে হিসাবে, আমাদের সমস্যা একটি শাস্ত্রীয় সমস্যা। একে "ন্যাপস্যাক সমস্যা" বলা হয় ( এটি গুগল করুন , যদি আপনি ইতিমধ্যে এটি কী না জানেন তবে 100000 এরও বেশি সংযোগ রয়েছে)।

আসুন লোভী সমাধান থেকে শুরু করি ...

(আরও অধ্যায়ে 3 এবং আরও পড়ুন।)

অন্যান্য স্মার্ট সরঞ্জাম

আমাকে আরও বলা হয়েছে যে ডেবিয়ান তার ডিস্ট্রো সিডিগুলি তৈরি করার জন্য একটি সরঞ্জাম ব্যবহার করে যা আমার distributeপ্যাকেজগুলির সংগ্রহের চেয়ে স্মার্ট : এটির ফলাফলগুলি আরও ভাল কারণ এটি আন্তঃ-প্যাকেজ নির্ভরতার বিষয়ে যত্নশীল এবং প্যাকেজগুলির সংগ্রহগুলি সংগ্রহ করার চেষ্টা করবে on নির্ভরশীলতার অধীনে বন্ধ হওয়া প্রথম ডিস্ক, অর্থাত, 1 ম ডিস্কের কোনও প্যাকেজের জন্য অন্য ডিস্কের কোনও প্যাকেজের প্রয়োজন হবে না (বা কমপক্ষে, আমি বলব, এই জাতীয় নির্ভরতার সংখ্যা হ্রাস করা উচিত)।


1

ব্যাকআপ 2 এল এই কাজটি অনেক কিছু করতে পারে। এমনকি আপনি সরাসরি প্যাকেজটি ব্যবহার না করলেও আপনি এটি থেকে কিছু স্ক্রিপ্ট ধারণা পেতে পারেন।


0

rarআর্কাইভার স্বয়ংক্রিয়ভাবে আর্কাইভ এটির সাথে একটি নির্দিষ্ট আকারের খন্ডে আপ সৃষ্টি বিভক্ত করতে নির্দেশ দেওয়া সম্ভব হবে -vsizeপতাকা।

ডিরেক্টরি ট্রিটিকে সংরক্ষণাগারভুক্ত করে রাখুন foo, বলুন, 500 মেগাবাইট আপনার নির্দিষ্ট করে দেওয়া উচিত d
rar a backup.rar -v500m foo/


2
কেন রার? তার (+ bz2) + বিভাজক * নিক্সের জন্য আরও স্থানীয় পদ্ধতির।
rvs

"কামড়ের আকারের গাছগুলি" পুরোপুরি rarশোনায় না, যদি না আপনি প্রতিটি "অংশ "টিকে আবার নিজের ডিরেক্টরিতে আনপ্যাক করেন, তবে অবশ্যই কোনটি কাজ করবে না, কারণ অংশগুলি সেভাবে ডিজাইন করা হয়নি এবং ফাইলের সীমানায় বিভক্ত হয় না।
ম্যাটবিয়ানকো

1
যদি এমন সরঞ্জামগুলির বিষয়ে কথা বলা হয় যা tar+ splitপছন্দসই ফলাফল দেয়, তবে ডার আছে ; এখানে এর প্রাসঙ্গিক বৈশিষ্ট্য সম্পর্কে নোটটি দেওয়া আছে: "(স্লাইকস) এটি বেশ কয়েকটি অপসারণযোগ্য মিডিয়াতে কোনও সংরক্ষণাগারকে তাদের সংখ্যা যাই হোক না কেন এবং আকার যাই হোক না কেন বিভক্ত করতে সক্ষম করার জন্য এটি ডিজাইন করা হয়েছিল"। tar+ এর সাথে তুলনা করে split, আমি ধরে নিই, এটি সংরক্ষণাগারভুক্ত ফাইলগুলিতে অ্যাক্সেসের কিছু সহজ উপায়ের অনুমতি দেয়। (বিটিডাব্লু, এর অনুরূপ বৈশিষ্ট্যও রয়েছে distribute: " বিচ্ছিন্ন ব্যাকআপ" এবং "
প্রত্যক্ষ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.