মূলত বিরল এবং তারপরে প্রসারিত কোনও ফাইলকে আবার স্পার বানানো যেতে পারে?


29

আমি জানি যে স্পার্স ফাইলগুলি বোঝে এমন কোনও ইউটিলিটি ব্যবহার না করে যা মূলত স্পার্স ফাইল ছিল তা অনুলিপি করা বা স্থানান্তর করা 'গর্তগুলি' পূরণ করবে। একবারে কোনও দাগযুক্ত ফাইলটি আবার স্পর্শে ফিরে যাওয়ার কি কোনও পদ্ধতি বা ইউটিলিটি আছে?

উদাহরণস্বরূপ:
বিরল ফাইল তৈরি করুন:

% dd if=/dev/zero of=TEST bs=1 count=0 seek=1G
# do some op that pads out the holes
% scp TEST localhost:~/TEST2
% ls -lhs TEST*
   0 -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:35 TEST
1.1G -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:37 TEST2

কিছু উপায় আছে:

% resparse TEST2
to get:
   0 -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:35 TEST
  0G -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:37 TEST2

দুঃখিত, আমি মূল জিজ্ঞাসা বেশ সুন্দর করতে হয়েছিল ...
ব্যবহারকারী 25849

1
আমি যা দেখেছি তার থেকে কেবল এটিই করতে পারে কেবল একটি জিএনইউ 'সিপি', যেমন '% সিপি - স্পার্সে = সর্বদা পূর্ববর্তী-স্পার্স-ফাইল সদ্য-স্পার্স-ফাইল' প্রতিরোধকারী এটি করেন না ' জায়গায়'.
ব্যবহারকারী 25849

আপনি যদি একটি স্পার্স ফাইল অনুলিপি করতে চান এবং অনুলিপিটি অনুল্ক হতে দেয় তবে ব্যবহার করুন rsync -aS
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

উত্তর:


30

2015 সম্পাদনা করুন

ইউজন-লিনাক্স ২.২৫ হিসাবে লিনাক্সে fallocateইউটিলিটির পক্ষে একটি -d/ --dig-holeবিকল্প রয়েছে।

fallocate -d the-file

ফাইলের জিরো পূর্ণ প্রতিটি ব্লকের জন্য একটি গর্ত খনন করবে


পুরানো সিস্টেমে, আপনি এটি হাত দ্বারা করতে পারেন:

লিনাক্সের একটি FALLOC_FL_PUNCH_HOLEবিকল্প রয়েছে যা fallocateএটি করতে পারে। আমি একটি উদাহরণ সহ গিথুবে একটি স্ক্রিপ্ট পেয়েছি:

পাইথন থেকে FALLOC_FL_PUNCH_HOLE ব্যবহার করা

আপনি যা বলেছিলেন তা করার জন্য আমি এটি কিছুটা সংশোধন করেছি - শূন্যে ভরা ফাইলগুলির অঞ্চলে পাঞ্চ গর্ত। এটা এখানে:

পাইথন থেকে FALLOC_FL_PUNCH_HOLE ব্যবহার করে ফাইলগুলিতে ছিদ্র করতে পারে

usage: punch.py [-h] [-v VERBOSE] FILE [FILE ...]

Punch out the empty areas in a file, making it sparse

positional arguments:
  FILE                  file(s) to modify in-place

optional arguments:
  -h, --help            show this help message and exit
  -v VERBOSE, --verbose VERBOSE
                        be verbose

উদাহরণ:

# create a file with some data, a hole, and some more data
$ dd if=/dev/urandom of=test1 bs=4096 count=1 seek=0
$ dd if=/dev/urandom of=test1 bs=4096 count=1 seek=2

# see that it has holes
$ du --block-size=1 --apparent-size test1
12288   test1
$ du --block-size=1 test1
8192    test1

# copy it, ignoring the hole
$ cat test1 > test2
$ du --block-size=1 --apparent-size test2
12288   test2
$ du --block-size=1 test2
12288    test2

# punch holes again
$ ./punch.py test2
$ du --block-size=1 --apparent-size test2
12288   test2
$ du --block-size=1 test2
8192    test2

# verify
$ cmp test1 test2 && echo "files are the same"
files are the same

নোট করুন যে punch.pyমুষ্ট্যাঘাতের জন্য কেবল 4096 বাইটের ব্লকগুলি সন্ধান করে, সুতরাং এটি শুরু করার সময় এটি কোনও ফাইলকে ঠিক তেমন বিরল তৈরি করতে পারে না। এটি অবশ্যই স্মার্ট তৈরি করা যেতে পারে। এছাড়াও, এটি কেবলমাত্র হালকাভাবে পরীক্ষা করা হয়েছে , সুতরাং এটির উপর নির্ভর করার আগে সাবধান এবং ব্যাকআপগুলি তৈরি করুন !


1
আমি এটি সর্বোত্তম পছন্দ করি কারণ এর জন্য পুরো ফাইলটি পুনরায় লেখার প্রয়োজন নেই।
পিটার

8

আপনি যদি কোনও ফাইল স্পার্স করতে চান তবে আপনি সরাসরি এটির মাধ্যমে করতে পারেন dd

dd if=./zeropadded.iso of=./isnowsparse.iso conv=sparse

dd(1)ম্যানুয়াল থেকে :

          sparse   If one or more output blocks would consist solely of
                   NUL bytes, try to seek the output file by the required
                   space instead of filling them with NULs, resulting in a
                   sparse file.

সুতরাং, মনে রাখবেন যে পুরো ব্লকটি খালি থাকলে এটি কেবল এগিয়ে যাবে। সর্বাধিক বিরল ব্যবহারের জন্য bs=1


2
bs=512ডিস্কগুলি হ'ল ডিভাইসগুলি হ'ল এর চেয়ে কম কোনও ব্লকের আকার সত্যই বোঝায় না। (আরও bs=4096নতুন ড্রাইভে)
লাও

দেখে মনে হচ্ছে এটি সমতুল্যcp --sparse=always zeropadded.iso isnowsparse.iso
ম্যাক্সচলেপজিগ

2

tarএকটি -Sপতাকা দিয়ে এটি সংক্ষেপে সংক্ষিপ্ত করা (জিএনইউ টার অনুমান করে), এবং পুনরায় কার্যকর করা হবে scp... না। আমি যে ইউটিলিটি সম্পর্কে অবগত রয়েছি তার "ছিদ্র" কোথায় ছিল তা জানার উপায় থাকবে।


5
জিএনইউ সিপি একটি ফাইলকে শ্বাস ফেলা করবে: ম্যান পৃষ্ঠা থেকে: স্পারস = সর্বদা একটি স্পার ডিইএসটি ফাইল তৈরি করতে সুনির্দিষ্ট করুন যখনই SOURCE ফাইলটিতে শূন্য বাইটের দীর্ঘ পর্যাপ্ত ক্রম থাকে।
ব্যবহারকারী 25849

অসাধারণ. প্রতিদিন কিছু শিখুন - কখন এই পতাকাটি চালু হয়েছিল? একবারে "সুপরিচিত" প্রোগ্রামগুলির ম্যান-পৃষ্ঠাগুলি পড়ার অর্থ প্রদান করে; ডি
টিঙ্ক

2

এর সাথে আমার ভাগ্য ভালো ছিল:

cd whatever
rsync -avxWSHAXI . .

-Iবাহিনী সব ফাইল আপডেট করার জন্য, এটা মনে করে কিনা তারা বা পরিবর্তন করেছি নির্বিশেষে rsync; -Sকারণ sparsified করা নতুন ফাইল। -aএটিকে পুনরাবৃত্তির সাথে সংঘটিত করে তোলে যাতে আপনি একটি কমান্ডে পুরো ডিরেক্টরি গাছকে আলাদা করতে পারেন।

এটি কোনও বেসপোক সরঞ্জামের মতো ভাল নয় যা ছিদ্র খুঁজে বের করে এবং এগুলি ধ্বংস করে FALLOC_FL_PUNCH_HOLE, তবে পুরো ডিরেক্টরি গাছগুলি নকল করার চেয়ে ভাল।

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