สร้างไฟล์จำนวนมากที่มีเนื้อหาแบบสุ่ม


23

ฉันกำลังมองหาคำสั่งเพื่อสร้างไฟล์ (หลายพัน) ไฟล์ที่มีข้อมูลสุ่มอย่างน้อย 1KB

ตัวอย่างเช่น,

Name            size
file1.01        2K
file2.02        3K
file3.03        5K
etc.

ฉันจะสร้างไฟล์จำนวนมากเช่นนี้ได้อย่างไร


“ เอกสิทธิ์” หมายถึงอะไร? มันไม่สมเหตุสมผลในบริบทดังนั้นคุณอาจใช้คำผิด
Gilles 'SO- หยุดความชั่วร้าย'

ฉันหมายความว่าไฟล์ไม่สามารถมีเนื้อหาเดียวกันได้
JoãoJosé

ดังนั้นเอกสิทธิ์จะมีความหมายที่ไม่ซ้ำกัน
บางคน

คำตอบ:


25

เนื่องจากคุณไม่มีข้อกำหนดอื่น ๆ สิ่งนี้จึงควรใช้งานได้:

#! /bin/bash
for n in {1..1000}; do
    dd if=/dev/urandom of=file$( printf %03d "$n" ).bin bs=1 count=$(( RANDOM + 1024 ))
done

(สิ่งนี้ต้องการbashอย่างน้อยสำหรับ{1..1000})


2
นี้ต้องbashด้วยเหตุผลต่าง ๆ นานารวมทั้งและ$((…)) $RANDOMแม้$(…)อาจไม่มีอยู่ในทุกเชลล์
G-Man กล่าวว่า 'Reinstate Monica'

1
@ G-Man ในกรณีใด ๆ ไม่มีคุณสมบัติเหล่านั้นมีเฉพาะbashเขาก็มิได้เกิดในbash ( {1..1000}มาจากzsh, for n in...; doneและการขยายตัวตัวแปรมาจากบอร์นเชลล์$(...), $((...))และ$RANDOM มา ksh) คุณลักษณะที่ไม่ได้มี POSIX {1..1000}, และ$RANDOM /dev/urandom
Stéphane Chazelas

1
หากคุณต้องการ 1..1000 ให้คงความกว้างที่คุณต้องการ"%04d"ซึ่งในกรณีนี้bashหรือzshสามารถทำได้{0001..1000}โดยไม่มีprintf
dave_thompson_085

คุณสมบัติเพิ่มเติม: ฉันต้องการวิธีที่จะกระจายไฟล์เหล่านี้ไปยังไดเรกทอรีย่อยที่ซ้อนกันจำนวนมากแบบสุ่ม
STU

10

รูปแบบกับseq, xargs, ddและshuf:

seq -w 1 10 | xargs -n1 -I% sh -c 'dd if=/dev/urandom of=file.% bs=$(shuf -i1-10 -n1) count=1024'

คำอธิบายตามที่ร้องขอตามความคิดเห็น:

seq -w 1 10พิมพ์ลำดับของตัวเลขตั้งแต่01ถึง10

xargs -n1 -I%รันคำสั่งsh -c 'dd ... % ...'สำหรับแต่ละหมายเลขลำดับแทนที่%ด้วย

dd if=/dev/urandom of=file.% bs=$(shuf ...) count=1024สร้างไฟล์ที่ฟีดจาก/ dev / urandomด้วย1024บล็อกด้วยบล็อก

shuf -i1-10 -n1ค่าสุ่มตั้งแต่1ถึง10


วัดทำอะไรกันแน่
saruftw

1
@ คำอธิบายเพิ่มเติม saru95
FloHimself

สิ่งนี้จะสร้าง 10 ไฟล์ด้วยขนาดที่สุ่ม เปลี่ยน "10" เป็นจำนวนไฟล์ที่ต้องการ
Nay

2

คุณสามารถทำสิ่งนี้:

#!/bin/bash
filecount=0
while [ $filecount -lt 10000 ] ; do
    filesize=$RANDOM
    filesize=$(($filesize+1024))
    base64 /dev/urandom | 
    head -c "$filesize" > /tmp/file${filecount}.$RANDOM
    ((filecount++))
done

ฉันพยายามทำสิ่งนี้ แต่ไม่ได้ผล คุณอาจต้องการอธิบายพารามิเตอร์ :)
JoãoJosé

ขอบคุณมาก @rahul
BG Bruno

2

สิ่งนี้ใช้ขั้นตอนเดียวและดูเหมือนว่าค่อนข้างเร็ว แต่มีข้อ จำกัด ว่าไฟล์ทั้งหมดมีขนาดเท่ากัน

dd if=/dev/urandom bs=1024 count=10240 | split -a 4 -b 1k - file.

คำอธิบาย: ใช้ dd เพื่อสร้างข้อมูล 10240 * 1024 ไบต์ แยกออกเป็นไฟล์แยก 10240 ไฟล์ละ 1k (ชื่อจะเรียกใช้จาก 'file.aaaa' ถึง 'file.zzzz')

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.