Bagaimana cara membuat file besar di UNIX?

17

Saya menemukan cara di Windows untuk melakukan hal seperti itu

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/

Apakah ada cara di UNIX untuk menyalin file, menambahkan dan kemudian mengulangi prosesnya? Sesuatu seperti for .. cat file1.txt > file1.txt?

Thomas Lee
sumber
Mengapa menyalin file dan menambahkan bukan hanya menambahkan?
123
@ 123 append baik, tetapi bagaimana melakukan loop?
Thomas Lee
4
for i in {1..1000000};do echo "string" >> file;donedi bash.
123
9
Apakah harus berupa file teks? Anda dapat membuat berbagai ukuran file dari / dev / zero atau / dev / urandom.
RealSkeptic
2
Saya berharap type file >> fileuntuk berjalan dalam loop yang tak terbatas (setidaknya segera setelah itu cukup besar sehingga tidak muat di buffer).
Stéphane Chazelas

Jawaban:

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

Dengan csh/ tcsh:

repeat 10000 echo some test > large-file

Dengan zsh:

{repeat 10000 echo some test} > large-file

Pada sistem GNU, lihat juga:

seq 100000 > large-file

Atau:

truncate -s 10T large-file

(membuat file jarang 10TiB (sangat besar tetapi tidak memakan ruang pada disk)) dan alternatif lain yang dibahas di "Buat file uji dengan banyak nol byte" .


Melakukan cat file >> fileide yang buruk.

Pertama, itu tidak bekerja dengan beberapa catimplementasi yang menolak untuk membaca file yang sama dengan file outputnya. Tetapi bahkan jika Anda mengatasinya dengan melakukan cat file | cat >> file, jika filelebih besar dari catbuffer internal, itu akan menyebabkan catberjalan dalam infinite loop karena pada akhirnya akan membaca data yang telah ditulis sebelumnya.

Pada sistem file yang didukung oleh hard drive rotasi, itu akan sangat tidak efisien juga (setelah mencapai ukuran yang lebih besar daripada yang mungkin di-cache dalam memori) karena drive harus bolak-balik antara lokasi tempat membaca data, dan di mana menulisnya.

Stéphane Chazelas
sumber
19
Atau dd if=/dev/zero of=large-file bs=1024 count=1024untuk file 1MB
selesai24
7
@ DougO'Neal saya menemukan dd if=/dev/zero of=test bs=1M count=1lebih jelas.
123
4
@ DougO'Neal, lihat Membuat file uji dengan banyak byte nol
Stéphane Chazelas
1
Atau gunakan / dev / urandom sebagai ganti / dev / nol jika Anda menginginkan data acak.
user253751
3
@ robertotomás ya, semua orang menggunakan dd, tapi saya tidak pernah mengerti mengapa. Bahkan, saya pikir saya hanya pernah menggunakannya untuk membaca MBR atau tugas-tugas pinggiran serupa. Dalam pengalaman saya, alat-alat lain lebih cepat, lebih sederhana dan lebih aman untuk sebagian besar kasus di mana orang menggunakan dd. Saya pikir ini adalah salah satu kasus di mana umum! = Optimal, suka sudo suatau cat file | grep foo.
terdon
22

Anda dapat membuat file besar di Solaris menggunakan:

mkfile 10g /path/to/file

Cara lain yang berfungsi pada Solaris (dan Linux):

truncate -s 10g /path/to file

Dimungkinkan juga untuk menggunakan:

dd if=/dev/zero of=/path/to/file bs=1048576 count=10240
Lambert
sumber
dd satu seperti terabyte
123
1
Tentukan "file besar" :-) Tapi saya diedit karena sampel lain semuanya menyatakan 10g ...
Lambert
truncate Tidak dapat menjalankan 'truncate'. Tidak ada file atau direktori yang terpotong yang tampaknya hanya Linux.
schily
truncatememang ada di Solaris 11.2+
Lambert
11

Cara tercepat untuk membuat file besar di sistem Linux adalah fallocate:

sudo fallocate -l 2G bigfile

fallocatememanipulasi sistem file, dan tidak benar-benar menulis ke sektor data secara default, dan karenanya sangat cepat. Kelemahannya adalah ia harus dijalankan sebagai root.

Menjalankannya secara berurutan dalam satu lingkaran, Anda dapat mengisi sistem file terbesar dalam hitungan detik.

Dari man fallocate

fallocate digunakan untuk memanipulasi ruang disk yang dialokasikan untuk suatu file, baik untuk membatalkan alokasi atau melakukan pra-alokasi.
Untuk sistem file yang mendukung panggilan sistem fallocate, pra-alokasi dilakukan dengan cepat dengan mengalokasikan blok dan menandainya sebagai tidak diinisialisasi, tidak memerlukan IO ke blok data. Ini jauh lebih cepat daripada membuat file dengan mengisinya dengan nol.
Didukung untuk XFS (sejak Linux 2.6.38), ext4 (sejak Linux 3.0), Btrfs (sejak Linux 3.7) dan tmpfs (sejak Linux 3.5).

Rui F Ribeiro
sumber
1
Ini harus menjadi jawaban yang diterima. Mudah dan cepat.
ardochhigh
8

Ini akan terus berjalan hingga Anda CTRL-C:

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

Berhati-hatilah, karena Anda bisa mendapatkan ratusan ribu baris / detik ...

Dari man yes:

yes - output a string repeatedly until killed
Tanda tanya
sumber
Ini adalah metode yang sangat mudah untuk membuat file besar di lingkungan linux.
Chaminda Bandara
1
yes $BIG_STRING | head -c $TARGET_SIZE >> dummy.txtakan membiarkan Anda mendapatkan jumlah yang tepat. (-n $ TARGET_NUMBER_OF_LINES). yessecara otomatis akan mati akibat 'pipa pecah' ketika headberakhir karena jumlah target telah tercapai.
PypeBros
4

Jika saya mengerti Anda dengan benar, Anda mencari sesuatu seperti:

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

Itu akan membuat file dengan 22 pengulangan "test line". Jika Anda menginginkan ukuran file tertentu, Anda dapat menggunakan sesuatu seperti ini (di Linux). 1024 adalah satu kilobyte:

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

Secara pribadi, ketika saya ingin membuat file besar, saya menggunakan dua file dan cat satu ke yang lain. Anda dapat mengulangi prosesnya hingga mencapai ukuran yang diinginkan (1MB di sini):

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

Perhatikan bahwa solusi ini akan sering melebihi ukuran yang diinginkan karena jika file di bawah batas, semuanya akan dimasukkan lagi ke dalamnya.

Akhirnya, jika semua yang Anda inginkan adalah file dengan ukuran yang diinginkan dan tidak perlu benar-benar berisi apa pun, Anda dapat menggunakan truncate:

truncate -s 1M file
terdon
sumber
1
Apakah catfile sebenarnya memiliki keuntungan untuk hanya menambahkan? Tampaknya akan memakan waktu lebih lama karena harus memotong dua proses setiap loop dan juga memindahkan seluruh konten beberapa kali.
123
1
@ 123 kecepatan. The catPendekatan jauh, jauh lebih cepat. Masuk akal untuk membuat file besar tapi itu menciptakan file 545M dalam 10 detik pada mesin saya. whileLoop yang sama dengan echo "test line" >> filemembuat file 96K dalam jumlah waktu yang sama.
terdon
Saya kira masalahnya dengan pendekatan "kucing" adalah ia tumbuh secara eksponensial. Saat memulai iterasi kedua, 'file baru' sudah memiliki 1 baris dan 'file' memiliki 2, dan ketika sudah selesai, 'file baru' sekarang 3 baris dan 'file' adalah 5. Selanjutnya, 'file baru' akan menjadi 8 dan ' file 'akan 13. Selanjutnya (21, 34), dll.
PypeBros
Kelemahan: ini mungkin membutuhkan lebih banyak ruang disk (> = 1,5 * diinginkan_size) daripada ukuran file target saat sedang membuat file.
PypeBros
btw. Jika ada truncate, Anda dapat truncate -s 1Gmembuat file di tempat pertama. unix.stackexchange.com/a/269184/85549 . Anda bisa menggantinya dengan head -c $DESIRED_SIZE, mungkin di dalam whileloop.
PypeBros
3

Dengan memiparkan konten /dev/urandomke, headAnda dapat mengarahkan output ke file, jadi:

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

Akan memberi Anda file dengan 100 byte sampah.

pemboros
sumber
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

efek yang sama dari skrip windows Anda tetapi dalam bash, Anda tidak dapat menggabungkan file ke dirinya sendiri, secara langsung.

MelBurslan
sumber
Selain lupa .txtekstensi, Anda meninggalkan 2 file besar di akhir.
ott--