Một tập tin ban đầu thưa thớt và sau đó được mở rộng có thể được làm lại một lần nữa không?


29

Tôi biết rằng sao chép hoặc chuyển những gì ban đầu là một tệp thưa thớt mà không sử dụng tiện ích hiểu các tệp thưa thớt sẽ khiến các 'lỗ hổng' bị lấp đầy. Có một phương pháp hoặc tiện ích để biến những gì đã từng là một tập tin thưa thớt trở lại thưa thớt không?

Ví dụ:
tạo tệp thưa thớt:

% 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

Có cách nào để:

% 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

Xin lỗi, tôi đã phải làm đẹp các bản gốc ...
user25849

1
Điều duy nhất có thể làm điều này từ tất cả những gì tôi đã thấy là một 'cp' GNU, như trong '% cp --spzzy = luôn luôn là tập tin thưa thớt mới tập tin' Người gièm pha là nó sẽ không làm điều đó ' tại chỗ '.
dùng25849

Nếu bạn muốn sao chép một tập tin thưa thớt và để bản sao thưa thớt, hãy sử dụng rsync -aS.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


30

Chỉnh sửa 2015

kể từ phiên bản linux 2.25, fallocatetiện ích trên Linux có tùy chọn -d/ --dig-holecho điều đó.

fallocate -d the-file

Sẽ đào một lỗ cho mọi khối đầy số không trong tệp


Trên các hệ thống cũ hơn, bạn có thể làm điều đó bằng tay:

Linux có một FALLOC_FL_PUNCH_HOLEtùy chọn để fallocatecó thể làm điều này. Tôi tìm thấy một tập lệnh trên github với một ví dụ:

Sử dụng FALLOC_FL_PUNCH_HOLE từ Python

Tôi đã sửa đổi nó một chút để làm những gì bạn yêu cầu - đục lỗ trong các vùng của tệp chứa đầy số không. Đây là:

Sử dụng FALLOC_FL_PUNCH_HOLE từ Python để đục lỗ trong các tệp

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

Thí dụ:

# 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

Lưu ý rằng punch.pychỉ tìm thấy các khối 4096 byte để đục lỗ, vì vậy nó có thể không tạo ra một tệp chính xác như khi bạn bắt đầu. Nó có thể được làm thông minh hơn, tất nhiên. Ngoài ra, nó chỉ được thử nghiệm nhẹ , vì vậy hãy cẩn thận và tạo bản sao lưu trước khi tin tưởng nó!


1
Tôi thích điều này nhất vì nó không yêu cầu viết lại toàn bộ tập tin.
Peter

8

Nếu bạn muốn làm cho một tập tin thưa thớt, bạn có thể làm điều đó trực tiếp với dd.

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

Từ dd(1)hướng dẫn:

          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.

Vì vậy, lưu ý rằng nó sẽ tìm kiếm phía trước chỉ khi toàn bộ khối trống. Để sử dụng thưa thớt tối đa bs=1.


2
Bất kỳ kích thước khối nhỏ hơn bs=512không thực sự có ý nghĩa, vì đĩa là thiết bị khối. ( bs=4096trong các ổ đĩa mới hơn)
lapo

có vẻ như điều này tương đương vớicp --sparse=always zeropadded.iso isnowsparse.iso
maxschlepzig

2

Viết tắt của tarnó bằng một -Scờ (giả sử GNU tar) và thực hiện lại scp... không. Không có tiện ích nào tôi biết sẽ có cách để biết "lỗ hổng" ở đâu.


5
GNU cp sẽ hiển thị lại một tệp: Từ trang man: Chỉ định --spzzy = luôn để tạo tệp DEST thưa thớt bất cứ khi nào tệp SOURCE chứa một chuỗi byte đủ dài.
dùng25849

Tuyệt vời. Học một cái gì đó mỗi ngày - lá cờ đó được giới thiệu khi nào? Thỉnh thoảng mới có thể đọc các trang của các chương trình "nổi tiếng"; D
tink

2

Tôi đã có may mắn với điều này:

cd whatever
rsync -avxWSHAXI . .

Các -I lực lượng rsync để cập nhật tất cả các file, bất kể nó nghĩ rằng họ đã thay đổi hay không; các -Snguyên nhân các tập tin mới được thưa thớt. -alàm cho nó xảy ra đệ quy để bạn có thể khai thác toàn bộ cây thư mục trong một lệnh.

Nó không tốt bằng một công cụ bespoke để tìm ra các lỗ hổng và phá hủy chúng FALLOC_FL_PUNCH_HOLE, nhưng tốt hơn là phải sao chép toàn bộ cây thư mục.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.