Làm thế nào để đệm một tập tin đến một kích thước mong muốn?


15

Tôi có một tệp mà tôi muốn đệm cho đến khi nó đạt 16 MiB (16777216 byte). Hiện tại nó là 16515072 byte. Sự khác biệt là 262144 byte.

Làm thế nào để tôi đệm nó?

Điều này dường như không hoạt động:

cp smallfile.img largerfile.img
dd if=/dev/zero of=largerfile.img bs=1 count=262144

2
@terabyte; Bạn có muốn đệm vật lý hoặc đệm logic? Nói cách khác; tập tin chỉ hiển thị kích thước 16777216 (và có thể chứa lỗ hổng) hay nó cũng sẽ chiếm dung lượng lưu trữ trên đĩa? - BTW, chọn một bs=1trong ddlà kinh nghiệm của tôi rất tốn kém thời gian chạy.
Janis

5
truncate -s 16M thefile
frostschutz

4
@frostschutz đó là một câu trả lời hay, bạn đã đăng nó dưới dạng câu trả lời.
derobert

@derobert, Điều gì với người dùng trang web StackExchange đăng câu trả lời hợp pháp, đơn giản dưới dạng nhận xét?
dùng1717828

@ user1717828 không chắc chắn, có lẽ là một câu hỏi hay cho meta.
derobert

Câu trả lời:


10

Thả of=largerfile.txtvà nối thiết bị xuất chuẩn vào tệp:

dd if=/dev/zero bs=1 count=262144 >> largerfile.txt

1
seeklà một lựa chọn đúng đắn ở đây.
0andriy

15

Bên cạnh các câu trả lời để có phần đệm vật lý, bạn cũng có thể để phần lớn không gian phần đệm trong tệp chỉ trống ("lỗ"), bằng cách seekvào vị trí cuối mới của tệp và viết một ký tự:

dd if=/dev/zero of=largerfile.txt bs=1 count=1 seek=16777215

(có lợi thế là hiệu suất cao hơn nhiều, cụ thể là bs=1, và không chiếm một lượng lớn không gian đĩa bổ sung).

Phương pháp đó dường như hoạt động ngay cả khi không thêm bất kỳ ký tự nào, bằng cách sử dụng if=/dev/nullvà kích thước tệp mong muốn cuối cùng:

dd if=/dev/null of=largerfile.txt bs=1 count=1 seek=16777216

Một biến thể biểu diễn của giải pháp đệm vật lý sử dụng kích thước khối lớn hơn là:

padding=262144 bs=32768 nblocks=$((padding/bs)) rest=$((padding%bs))
{
  dd if=/dev/zero bs=$bs count=$nblocks
  dd if=/dev/zero bs=$rest count=1
} 2>/dev/null >>largerfile.txt

3
Chính xác. Trong trường hợp truncate -s +262144 largerfile.txtnày cũng sẽ nhanh chóng.
don_crissti

4

Anwser tốt nhất ở đây là của Janis (ở trên) vì nó cho phép bạn quên kích thước tệp hiện tại và đệm trực tiếp đến kích thước mong muốn mà không cần tính toán.

Nó cũng tận dụng các tệp thưa thớt, mà nối thêm / dev / zero thì không.

Câu trả lời có thể gọn gàng hơn, bởi vì 'đếm' được phép là 0 và bạn vẫn nhận được phần đệm:

dd if=/dev/null of=largerfile.txt bs=1 count=0 seek=16777216

(Chỉnh sửa: điều này đúng với GNU GNU, nhưng hành vi của count=0nó là dành riêng cho nền tảng, xem các bình luận)


Bạn đã nhầm: count=0không xác định, nhưng thường giống như khi không có counttham số nào được chỉ định. Nhiều vấn đề hơn: ddcắt ngắn tệp thành 16777216 byte, nhưng nếu bạn hy vọng rằng điều này sẽ tạo ra một lỗ ở cuối, thì bạn đã nhầm vì trước tiên bạn cần ghi dữ liệu sau lỗ và sau đó cắt nó thành kích thước không chứa dữ liệu .
schily

Count = 0 không có gì giống như chỉ định không có tham số đếm. Bạn đang nói đó dd if=/dev/zero of=somefilelà giống như dd if=/dev/zero of=somefile count=0? Thử nó.
PeteC

Tất nhiên! count=0 giống như nếu bạn không nói rõ một tham số đếm ở tất cả. Điều này đúng ít nhất là đối với tất cả các triển khai đã được bắt nguồn từ các nguồn ban đầu. Hãy thử nó, có vẻ như bạn đã không bao giờ làm việc với ddlệnh ban đầu .
schily

Tôi không thể tìm thấy bất kỳ tài liệu nào chỉ định 0 là một giá trị duy nhất cho countý nghĩa 'bỏ qua tham số này'. Bạn có thể tìm thấy bất kỳ? Không có tài liệu này, count=0có nghĩa là 'viết các khối không' và bất kỳ sai lệch nào từ đây là một lỗi ... (nguồn gốc hoặc không).
PeteC

1
Đây là tài liệu POSIX từ trước tháng 5 năm 2015 khi văn bản chưa được chỉnh sửa được sửa.
schily

1

Bạn có phải sử dụng dd? Nếu bạn muốn một tệp có độ dài (logic) cụ thể, chỉ cần viết số 0 vào vị trí bạn muốn. Các byte giữa đầu trước và byte được ghi sẽ được hiển thị là có byte rỗng. Đây là một ví dụ sử dụng perl.

$ echo Hello > file
$ ls -l file
-rw-r--r-- 1 user group 6 Apr 16 22:59 file
$ perl -le 'open(my $f,"+<","file"); seek($f, 16777216 - 2, 0); print $f "\0"'
$ ls -ln file
-rw-r--r-- 1 user group 16777216 Apr 16 22:59 file

Tại sao "- 2" trong dòng? Kịch bản sẽ viết một byte, vì vậy chúng tôi trừ đi 1 để tìm đến vị trí trước byte đó. Chúng tôi cất cánh khác vì vị trí tìm kiếm không có chỉ số.

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.