ไฟล์ที่กระจัดกระจายเดิมและจากนั้นจะสามารถทำให้กระจัดกระจายอีกครั้ง?


29

ฉันรู้ว่าการคัดลอกหรือถ่ายโอนสิ่งที่เดิมเป็นไฟล์หร็อมแหร็มโดยไม่ต้องใช้ยูทิลิตี้ที่เข้าใจไฟล์กระจัดกระจายจะทำให้ 'หลุม' ถูกเติมเต็ม มีวิธีการหรือยูทิลิตี้เพื่อเปลี่ยนสิ่งที่ครั้งหนึ่งเคยเป็นไฟล์กระจัดกระจาย

ตัวอย่างเช่น:
สร้างไฟล์ sparse:

% 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

ขออภัยฉันต้อง
ปรับปรุงคำถาม

1
สิ่งเดียวที่สามารถทำได้จากสิ่งที่ฉันเห็นคือ GNU 'cp' ดังเช่นใน '% cp --sparse = เสมอ - sparse-file ใหม่-sparse-file' spractor คือมันจะไม่ทำ ' ในสถานที่'.
user25849

rsync -aSหากคุณต้องการที่จะคัดลอกไฟล์เบาบางและปล่อยให้คัดลอกจะเบาบางใช้
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


30

แก้ไขปี 2015

ตั้งแต่ util-linux 2.25, fallocateยูทิลิตี้บน Linux มีตัวเลือก-d/ a--dig-hole

fallocate -d the-file

จะขุดหลุมสำหรับทุกบล็อกที่เต็มไปด้วยเลขศูนย์ในไฟล์


ในระบบเก่าคุณสามารถทำได้ด้วยตัวเอง:

Linux มีFALLOC_FL_PUNCH_HOLEตัวเลือกให้fallocateทำเช่นนั้นได้ ฉันพบสคริปต์บน github พร้อมตัวอย่าง:

ใช้ FALLOC_FL_PUNCH_HOLE จาก Python

ฉันปรับเปลี่ยนเล็กน้อยเพื่อทำสิ่งที่คุณถาม - เจาะรูในพื้นที่ของไฟล์ที่เต็มไปด้วยเลขศูนย์ นี่มันคือ:

ใช้ FALLOC_FL_PUNCH_HOLE จาก Python เพื่อเจาะรูในไฟล์

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ในไดรฟ์ที่ใหม่กว่า)
lapo

ดูเหมือนว่านี่จะเทียบเท่ากับcp --sparse=always zeropadded.iso isnowsparse.iso
maxschlepzig

2

ย่อมาจากtarด้วย-Sแฟล็ก (สมมติว่า GNU tar) และเรียกใช้scp... ไม่ ไม่มียูทิลิตี้ที่ฉันรู้ว่ามีวิธีรู้ว่า "หลุม" อยู่ที่ไหน


5
GNU cp จะทำลายไฟล์: จากหน้า man: ระบุ --sparse = always เพื่อสร้างไฟล์ DEST กระจัดกระจายเมื่อใดก็ตามที่ไฟล์ SOURCE มีลำดับที่ยาวพอเป็นศูนย์ไบต์
user25849

น่ากลัว เรียนรู้บางสิ่งบางอย่างทุกวัน - เมื่อมีการแนะนำสถานะนั้น จ่ายเพื่ออ่าน man-man ของโปรแกรม "ที่รู้จักกันดี" นาน ๆ ครั้ง D
tink

2

ฉันโชคดีกับสิ่งนี้:

cd whatever
rsync -avxWSHAXI . .

-Iกองกำลัง rsync เพื่ออัพเดตไฟล์ทั้งหมดโดยไม่คำนึงถึงไม่ว่าจะคิดว่าพวกเขาได้เปลี่ยนหรือไม่ -Sทำให้ไฟล์ใหม่ที่จะ sparsified -aทำให้เกิดขึ้นซ้ำ ๆ เพื่อให้คุณสามารถแยกแผนภูมิต้นไม้ทั้งหมดในคำสั่งเดียว

มันไม่ดีเท่าเครื่องมือ bespoke ที่ตามล่าหาและทำลายพวกมันด้วยFALLOC_FL_PUNCH_HOLEแต่มันดีกว่าที่จะทำซ้ำทั้งแผนผังไดเรกทอรี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.