Làm thế nào để tạo một tệp lớn trong UNIX?


17

Tôi tìm thấy một cách trong Windows để làm điều đó

echo "This is just a sample line appended  to create a big file. " > dummy.txt
for /L %i in (1,1,21) do type dummy.txt >> dummy.txt

http://www.windows-commandline.com/how-to-create-large-dummy-file/

Có cách nào trong UNIX để sao chép một tập tin, nối thêm và sau đó lặp lại quá trình không? Một cái gì đó như thế for .. cat file1.txt > file1.txtnào?


Tại sao sao chép tệp và nối thêm thay vì chỉ nối thêm?
123

@ 123 chắp thêm là tốt, nhưng làm thế nào để làm vòng lặp?
Thomas Lee

4
for i in {1..1000000};do echo "string" >> file;donetrong bash.
123

9
Nó có phải là một tập tin văn bản không? Bạn có thể tạo bất kỳ kích thước nào của tệp từ / dev / zero hoặc / dev / urandom.
RealSkeptic

2
Tôi dự kiến type file >> filesẽ chạy trong một vòng lặp vô hạn (ít nhất là ngay khi nó đủ lớn để nó không vừa trong bộ đệm).
Stéphane Chazelas

Câu trả lời:


29
yes "Some text" | head -n 100000 > large-file

Với csh/ tcsh:

repeat 10000 echo some test > large-file

Với zsh:

{repeat 10000 echo some test} > large-file

Trên các hệ thống GNU, xem thêm:

seq 100000 > large-file

Hoặc là:

truncate -s 10T large-file

(tạo tệp thưa thớt 10TiB (rất lớn nhưng không chiếm bất kỳ dung lượng nào trên đĩa)) và các lựa chọn thay thế khác được thảo luận tại "Tạo tệp thử nghiệm có nhiều byte bằng 0" .


Làm cat file >> filesẽ là một ý tưởng tồi.

Đầu tiên, nó không hoạt động với một số cattriển khai từ chối đọc các tệp giống như tệp đầu ra của chúng. Nhưng ngay cả khi bạn làm việc xung quanh nó bằng cách thực hiện cat file | cat >> file, nếu filelớn hơn catbộ đệm bên trong, điều đó sẽ gây ra catchạy trong một vòng lặp vô hạn vì cuối cùng nó sẽ đọc dữ liệu mà nó đã viết trước đó.

Trên các hệ thống tệp được hỗ trợ bởi ổ cứng quay, nó cũng sẽ không hiệu quả (sau khi đạt kích thước lớn hơn khả năng được lưu trong bộ nhớ) vì ổ đĩa sẽ cần phải qua lại giữa vị trí đọc dữ liệu, và đó là nơi để viết nó.


19
Hoặc dd if=/dev/zero of=large-file bs=1024 count=1024cho tệp 1MB
doneal24

7
@ DougO'Neal tôi thấy dd if=/dev/zero of=test bs=1M count=1rõ ràng hơn.
123


1
Hoặc sử dụng / dev / urandom thay vì / dev / zero nếu bạn muốn dữ liệu ngẫu nhiên.
dùng253751

3
@ robertotomás vâng, mọi người đều dùng dd, nhưng tôi chưa bao giờ hiểu tại sao. Trên thực tế, tôi nghĩ rằng tôi chỉ từng sử dụng nó để đọc MBR hoặc các tác vụ bên lề tương tự. Theo kinh nghiệm của tôi, các công cụ khác nhanh hơn, đơn giản hơn và an toàn hơn cho phần lớn các trường hợp mọi người sử dụng dd. Tôi nghĩ rằng đây là một trong những trường hợp phổ biến! = Tối ưu, thích sudo suhoặc cat file | grep foo.
terdon

22

Bạn có thể tạo một tệp lớn trên Solaris bằng cách sử dụng:

mkfile 10g /path/to/file

Một cách khác hoạt động trên Solaris (và Linux):

truncate -s 10g /path/to file

Cũng có thể sử dụng:

dd if=/dev/zero of=/path/to/file bs=1048576 count=10240

dd one giống như một terabyte
123

1
Xác định "một tệp lớn" :-) Nhưng tôi đã chỉnh sửa vì các mẫu khác đều ở trạng thái 10g ...
Lambert

cắt ngắn Không thể thực hiện 'cắt ngắn'. Không có tập tin hoặc thư mục nào Truncate dường như chỉ là Linux.
schily

truncatekhông tồn tại trên Solaris 11.2+
Lambert

11

Cách nhanh nhất có thể để tạo một tệp lớn trong hệ thống Linux là fallocate:

sudo fallocate -l 2G bigfile

fallocatethao tác hệ thống tập tin và không thực sự ghi vào các thành phần dữ liệu theo mặc định và như vậy là cực kỳ nhanh. Nhược điểm của nó là nó phải được chạy như root.

Chạy liên tiếp trong một vòng lặp, bạn có thể điền vào hệ thống tập tin lớn nhất trong vài giây.

Từ man fallocate

fallocate được sử dụng để thao tác không gian đĩa được phân bổ cho một tệp, hoặc để phân bổ hoặc phân bổ nó.
Đối với các hệ thống tập tin hỗ trợ cuộc gọi hệ thống ngụy biện, việc sắp xếp trước được thực hiện nhanh chóng bằng cách phân bổ các khối và đánh dấu chúng là chưa được khởi tạo, không yêu cầu IO cho các khối dữ liệu. Điều này nhanh hơn nhiều so với việc tạo một tệp bằng cách điền vào nó bằng số không.
Được hỗ trợ cho XFS (kể từ Linux 2.6,38), ext4 (kể từ Linux 3.0), Btrfs (kể từ Linux 3.7) và tmpfs (kể từ Linux 3.5).


1
Đây phải là câu trả lời được chấp nhận. Dễ dàng và nhanh chóng.
ardochhigh

8

Điều này sẽ tiếp tục cho đến khi bạn CTRL-C:

yes This is stuff that I want to put into my file... >> dummy.txt

Hãy cẩn thận, bởi vì bạn có thể nhận được hàng trăm ngàn dòng / giây ...

Từ man yes:

yes - output a string repeatedly until killed

Đây là một phương pháp rất dễ dàng để tạo một tệp lớn trong môi trường linux.
Chaminda Bandara

1
yes $BIG_STRING | head -c $TARGET_SIZE >> dummy.txtsẽ cho phép bạn có được số tiền chính xác. (-n $ TARGET_NUMBER_OF_LINES). yessẽ tự động chết do 'đường ống bị vỡ' khi headchấm dứt vì đã đạt đến số mục tiêu.
PypeBros

4

Nếu tôi hiểu bạn một cách chính xác, bạn đang tìm kiếm một cái gì đó như:

echo "test line" > file;
for i in {1..21}; do echo "test line" >> file; done

Điều đó sẽ tạo ra một tệp với 22 lần lặp lại "dòng thử nghiệm". Nếu bạn muốn có một kích thước tệp cụ thể, bạn có thể sử dụng một cái gì đó như thế này (trên Linux). 1024 là một kilobyte:

while [ $(stat -c "%s" file) -le 1024 ]; do echo "test line" >> file; done

Cá nhân, khi tôi muốn tạo một tệp lớn, tôi sử dụng hai tệp và một tệp khác. Bạn có thể lặp lại quy trình cho đến khi bạn đạt được kích thước mong muốn (1MB tại đây):

echo "test line" > file;
while [ $(stat -c "%s" file) -le 1048576 ]; do 
    cat file >> newfile
    cat newfile >> file
done

Lưu ý rằng giải pháp này thường sẽ vượt quá kích thước mong muốn vì nếu tệp nằm dưới giới hạn, mọi thứ sẽ được đưa vào lại.

Cuối cùng, nếu tất cả những gì bạn muốn là một tệp có kích thước mong muốn và không cần nó thực sự chứa bất cứ thứ gì, bạn nên sử dụng truncate:

truncate -s 1M file

1
Liệu cating các tập tin thực sự có bất kỳ lợi thế để chỉ nối thêm? Có vẻ như sẽ mất nhiều thời gian hơn vì nó phải rẽ nhánh hai quá trình mỗi vòng lặp và cũng di chuyển toàn bộ nội dung nhiều lần.
123

1
@ 123 tốc độ. Cách cattiếp cận là nhiều, nhanh hơn nhiều. Nó chỉ có ý nghĩa đối với việc tạo các tệp lớn nhưng điều đó đã tạo ra tệp 545M trong 10 giây trên máy của tôi. whileVòng lặp tương tự với việc echo "test line" >> filetạo một tệp 96K trong cùng một khoảng thời gian.
terdon

Tôi đoán điều với cách tiếp cận "con mèo" là nó phát triển theo cấp số nhân. Khi bắt đầu lần lặp thứ hai, 'newfile' đã có 1 dòng và 'file' có 2 và khi hoàn thành, 'newfile' hiện là 3 dòng và 'file' là 5. Tiếp theo, 'newfile' sẽ là 8 và ' tập tin 'sẽ là 13. Tiếp theo (21, 34), v.v.
PypeBros

Nhược điểm: nó có thể chiếm nhiều dung lượng đĩa hơn (> = 1,5 * mong muốn kích thước) so với kích thước tệp mục tiêu trong khi nó đang tạo tệp.
PypeBros

btw. Nếu bạn có truncatexung quanh, bạn có thể truncate -s 1Gtạo tệp ở vị trí đầu tiên. unix.stackexchange.com/a/269184/85549 . Bạn có thể thay thế nó bằng một head -c $DESIRED_SIZE, có thể trong whilevòng lặp.
PypeBros

3

Bằng cách chuyển nội dung /dev/urandomđến, headbạn có thể chuyển hướng đầu ra thành một tệp, vì vậy:

 cat /dev/urandom | head --bytes=100 >> foo.bar

Sẽ cung cấp cho bạn một tệp có 100 byte rác.


1
echo "This is just a sample line appended  to create a big file. " > dummy.txt
i=1
while [ $i -le 21 ]
do
  cat dummy.txt >> bigfile
  cat bigfile > dummy.txt
  (( i++ ))
done

cùng tác dụng của tập lệnh windows của bạn nhưng trong bash, bạn không thể nối trực tiếp một tập tin với chính nó.


Ngoài việc quên .txttiện ích mở rộng, cuối cùng bạn sẽ để lại 2 tệp lớn.
ott--
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.