Làm thế nào bạn có thể cắt các tập tin bằng cách sử dụng dòng lệnh?


18

Bàn điều khiển tương đương với mã Python sau đây là gì:

target = file("disk", "w")    # create a file
target.seek(2*1024*1024*1024) # skip to 2 GB
target.write("\0")
target.close()

Có lẽ một số câu thần chú dd? Ý tưởng là tạo một tệp có kích thước rõ ràng là 2 GB để sử dụng, ví dụ như trong ảo hóa.

kvm disk -cd whatever.iso #Only allocate space as necessary

ddlà công cụ duy nhất truyền thống mà cho thấy nhiều seekcuộc gọi hệ thống (xem dd vs mèo - là dd vẫn còn phù hợp trong những ngày nhưng có những cách khác để da mèo này trên unices hiện điển hình.
Gilles 'Somali dừng vốn là xấu'

Câu trả lời:


8

Nói chung, chỉ cần sử dụng dd; nhưng khi bạn đề cập đến việc sử dụng ảo hóa KVM, bạn có thể cân nhắc sử dụng qemu-img:

qemu-img create -f raw disk 2G

Nó thực hiện giống như ddlệnh trong câu trả lời của Chris Down, một cách hiệu quả.

Bất kể bạn sử dụng lệnh nào, để sử dụng trong ảo hóa, tôi thực sự khuyên bạn nên sử dụng fallocateđể phân bổ trước các khối để ngăn phân mảnh và tăng hiệu suất.

fallocate -l 2G disk

Mặc dù vậy, nó không có sẵn trên tất cả các nền tảng và hệ thống tập tin. Điều này sẽ không ghi các số 0, mà chỉ gán các khối cho tệp, thay vì thực hiện theo yêu cầu sau mỗi lần nó phải mở rộng tệp.


Là trích dẫn một lỗi đánh máy?
badp

@badp có, đã sửa.
gertvdijk

2
qemu-imgddcả hai thực hiện một cuộc gọi hệ thống để đặt kích thước tệp (ftruncate), nhưng sẽ thực hiện nhiều hơn nữa để tự tải và các thư viện mà chúng được liên kết. Và, trong vấn đề đó, ddsẽ hiệu quả hơn qemu-imgrất nhiều (lớn hơn rất nhiều và được liên kết với nhiều thư viện hơn). GNU truncatesẽ còn hiệu quả hơn nữa. ddcũng có lợi thế là phổ biến. Điểm tốt về fallocatemặc dù.
Stéphane Chazelas

@StephaneChazelas Tôi hoàn toàn bình luận thứ hai của bạn. Tôi đã chỉnh sửa câu trả lời của mình để chỉ ra rằng đó qemu-imgchỉ là một sự thay thế rõ ràng trong việc sử dụng ảo hóa KVM.
gertvdijk

14

Bạn có thể tạo một tệp thưa thớt như thế này với dd:

dd of=file bs=1 seek=2G count=0
$ du file
0       disk
$ du --apparent-size file
2097152 disk

4
Ngoài ra, 2Glà một phần mở rộng GNU tới dd. Bạn có thể sử dụng bs=1024 seek=2097152nếu bạn không có GNU dd.
Chris Xuống

Heh, Glà một tiện ích mở rộng và không được hỗ trợ bởi phiên bản dd của OpenBSD ... nhưng, MKđược hỗ trợ, vì vậy có thể seek=2048Mdễ đọc hơn một chút, tùy thuộc vào nền tảng nào bạn đang nhắm mục tiêu
Earlz

Bạn nên đọc từ / dev / zero: if = / dev / zero
Daniel Fanjul

@DanielFanjul Tại sao? Hoàn toàn không có sự khác biệt, không có byte được viết.
Chris Xuống

@ChrisDown Bởi vì / dev / null không chứa dữ liệu khi bạn đọc, nhưng / dev / zero chứa các số không infinte. Ôi, đếm = 1, số byte cần ghi không được bằng không.
Daniel Fanjul

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.