Làm cách nào tôi có thể tạo một tệp có kích thước cụ thể từ một dòng lệnh?


125

Làm cách nào tôi có thể tạo một tệp (ví dụ: sử dụng touchlệnh hoặc cách tương tự khác), nhưng với kích thước cụ thể (ví dụ 14 MB)?

Trường hợp sử dụng là để kiểm tra FTP với các kích cỡ tệp khác nhau. Nếu chúng ta có thể tạo một tệp có kích thước cụ thể, sẽ rất hữu ích khi xác minh chuyển FTP, v.v.


Câu trả lời:


158

Sử dụng truncate:

truncate -s 14M filename

Từ man truncate:

DESCRIPTION
   Shrink or extend the size of each FILE to the specified size

[...]

 -s, --size=SIZE
          set or adjust the file size by SIZE

Lưu ý: truncatecó thể không khả dụng trên hệ thống của bạn, ví dụ như trên Mac OS X, nó không được cài đặt theo mặc định (nhưng bạn có thể dễ dàng cài đặt nó, ví dụ sử dụng macports). Trong những trường hợp này, bạn có thể cần phải sử dụng ddhoặc headthay vào đó.


2
ồ rất hay, tôi không biết điều này
n611x007

người đàn ông nói lên tất cả: cắt ngắn - thu nhỏ hoặc mở rộng kích thước của tệp đến kích thước đã chỉ định
ssedano

12
Thực sự rất tốt đẹp. Điều touchnày là không cần thiết, bạn chỉ cần chạy truncate -s 14M filenamenó sẽ tạo ra filenametrực tiếp.
terdon

tuyệt vời ... đây là những gì tôi tìm kiếm chính xác ... cảm ơn @ oliver-salzburg
fasil

34
Điều này dường như tạo ra một tệp thưa thớt , trong khi câu trả lời dưới đây (sử dụng "dd") thì không. Tôi không biết sự khác biệt có quan trọng với bạn không, nhưng tôi đoán rằng tôi đã chỉ ra điều đó
offby1

100

EDIT: Cách đơn giản nhất có lẽ truncatecâu trả lời của Ashutosh Vishwa Bandhu , nhưng được chỉ ra bởi @ offby1 tạo ra các tệp thưa thớt có thể không phải là điều bạn muốn. Các giải pháp dưới đây tạo tập tin bình thường, đầy đủ.


Các lệnh sau tạo tệp 14MB có tên foo:

  1. fallocate(cảm ơn @BreakENC , người đã đề xuất nó trong các bình luận và bỏ phiếu cho câu trả lời của Ahmed Masud bên dưới cũng đề cập đến nó.)

    fallocate -l 14000000 foo
    

    Lệnh này đặc biệt ấn tượng vì nó nhanh như truncate(tức thời) bất kể kích thước tệp mong muốn (không giống như các giải pháp khác sẽ chậm đối với các tệp lớn) và vẫn tạo các tệp bình thường, không phải là các tệp thưa thớt:

    $ truncate -s 14MB foo1.txt 
    $ fallocate -l 14000000 foo2.txt 
    $ ls -ls foo?.txt 
        0 -rw-r--r-- 1 terdon terdon 14000000 Jun 21 03:54 foo1.txt
    13672 -rw-r--r-- 1 terdon terdon 14000000 Jun 21 03:55 foo2.txt
    
  2. Tạo một tệp chứa đầy dữ liệu ngẫu nhiên

    dd if=/dev/urandom of=foo bs=14MB count=1
    

                                                                              hoặc là

    head -c 14MB /dev/urandom > foo
    
  3. Tạo một tệp chứa đầy \0s:

    dd if=/dev/zero of=foo.txt bs=14MB count=1
    

                                                                              hoặc là

    head -c 14MB /dev/zero > foo
    
  4. Tạo một tệp chứa đầy 14 MB dữ liệu đầu tiên của tệp khác:

    head -c 14MB bar.txt > foo
    
  5. Tạo một tệp chứa đầy 14 MB dữ liệu cuối cùng của tệp khác:

    tail -c 14MB bar.txt > foo
    

Trong tất cả các ví dụ trên, tệp sẽ là 14*1000*1000nếu bạn muốn 14*1024*1024, thay thế MBbằng M. Ví dụ:

dd if=/dev/urandom of=foo bs=14M count=1
head -c 14M /dev/zero > foo

fallocate chỉ giao dịch theo byte, vì vậy bạn phải thực hiện (14 * 1024 * 1024 = 14680064)

fallocate -l 14680064 foo

2
Cảm ơn ... Điều này cũng sẽ đáp ứng mục đích của tôi là tạo một tệp có kích thước mong muốn ...
fasil

2
Tôi khuyên bạn nên chống lại việc sử dụng ddnếu có một cách tiếp cận đơn giản hơn, ít có khả năng phá hủy hơn.
acolyte

3
@acolyte cũng vậy I. Đó là lý do tại sao mỗi ddgiải pháp có một giải pháp thay thế không phải là dd.
terdon

1
Mục nhập wiki nói rằng thậm chí dd (có số không) sẽ tạo ra một tệp thưa thớt, phải không? vi.wikipedia.org/wiki/Sparse_file
Michael

1
@Michael Tôi đã kiểm tra, chỉ để chắc chắn, và không có lệnh nào của tôi tạo ra các tệp thưa thớt. Các ddlệnh trên trang wiki là hoàn toàn khác nhau và không sử dụng /dev/zero. Còn về việc Mhay MBlà logic hơn, đưa nó lên với các nhà phát triển. Tất cả các trang đầu , đuôidd đều ghi rõ rằng "MB = 1000 * 1000, M = 1024 * 1024". Điều này có thể khác nhau trên các * nixes khác.
terdon

21
dd bs=1MB count=14 if=/dev/zero of=<yourfilename>

CẢNH BÁO dd sẽ âm thầm ghi đè lên bất cứ điều gì bạn có quyền viết, nếu bạn chỉ định nó một cách tự nguyện hoặc tình cờ. Hãy chắc chắn rằng bạn hiểu dd, ví dụ. với việc đọc dd --helpvà bạn không làm hỏng dòng lệnh dd của mình nếu không bạn có thể dễ dàng tạo ra mất dữ liệu không thể đảo ngược - thậm chí là toàn bộ .

Để bắt đầu, if=tệp đầu vàoof=tệp đầu ra . Luôn luôn kiểm tra xem bạn đã hiểu đúng chưa, trước khi chạy lệnh. :)


13

Sử dụng phép thuật dd;) trang người đàn ông

$ dd if=/dev/zero of=output.dat  bs=1024  count=14336

gây ra 14MB * 1024 = 14336KB hoặc:

$ dd if=/dev/zero of=output.dat  bs=1MB  count=14

Và bạn sẽ nhận được tệp đầu ra 14mb, chứa đầy số không: D


8

Đây phải là cách nhanh nhất để làm điều đó:

SEEK=$SIZE-1
dd if=/dev/zero of=outfile bs=1 seek=$SEEK count=1 

Mặt khác, chỉ cần viết một chương trình C hoặc perl nhanh và bẩn tìm kiếm vị trí chính xác và viết một byte đơn. Đây là RẤT NHIỀU so với thực tế đổ dữ liệu vào các khối.

Nếu bạn muốn tránh các tệp thưa thớt thì trên Linux (và có thể các hệ thống khác) bạn có thể sử dụng fallocate -l <length>từ đó util-linux.

Nếu điều đó không khả dụng và bạn có hệ thống tuân thủ POSIX thì bạn có thể viết chương trình nhanh và bẩn bằng cách sử dụng lệnh gọi thư viện posix_fallocate (). posix_fallocate đảm bảo phân bổ phạm vi được chỉ định để bạn sẽ không nhận được đầy đĩa khi sử dụng phạm vi tiếp theo nếu nó trả về thành công


6

Mặc dù ddlà cách di động để thực hiện, các lệnh mkfilexfs_mkfileđược viết riêng cho mục đích này và nhanh hơn:

mkfile size[b|k|m|g] filename
xfs_mkfile size[b|k|m|g] filename

Điều hấp dẫn là không có lệnh nào là phổ biến, vì vậy chúng không tốt cho việc viết các tập lệnh di động. Tuy nhiên, nếu tôi đang thực hiện nó một cách tương tác thông qua dòng lệnh, thì đó là những lệnh tôi sử dụng.

Theo mặc định, họ tạo các tệp không chứa đầy và không phải các tệp thưa (hoặc "holey") . Cả hai đều có -ntùy chọn để tạo các tệp thưa thớt thay thế.


1

Có một tùy chọn khác với Perl:

perl -e 'print "a" x 1024' > file.txt

Điều này sẽ tạo tập tin 1KB. Thay thế 1024 bằng bất kỳ số nào bạn thích.

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.