Tạo nhiều tệp có nội dung ngẫu nhiên


23

Tôi đang tìm kiếm một lệnh để tạo nhiều (hàng ngàn) tệp chứa ít nhất 1KB dữ liệu ngẫu nhiên.

Ví dụ,

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

Làm thế nào tôi có thể tạo nhiều tập tin như thế này?


Ý của bạn là gì Nó không có ý nghĩa trong ngữ cảnh, vì vậy bạn có thể đã sử dụng từ sai.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi có nghĩa là các tập tin không thể có cùng nội dung.
João José

Vì vậy, độc quyền sẽ có nghĩa là duy nhất.
số

Câu trả lời:


25

Vì bạn không có bất kỳ yêu cầu nào khác, nên một cái gì đó như thế này sẽ hoạt động:

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

(điều này cần bashít nhất cho {1..1000}).


2
Điều này cần bashvì nhiều lý do, bao gồm $((…))$RANDOM. Thậm chí $(…)có thể không tồn tại trong mọi vỏ.
G-Man nói 'Phục hồi Monica'

1
@ G-Man, trong mọi trường hợp, không ai trong số những tính năng đặc trưng cho bashhay họ đã bắt nguồn từ bash ( {1..1000}đến từ zsh, for n in...; donevà mở rộng biến xuất phát từ vỏ Bourne, $(...), $((...))$RANDOM đến ksh). Các tính năng không phải là POSIX là {1..1000}, $RANDOM/dev/urandom.
Stéphane Chazelas

1
Nếu bạn muốn 1..1000 có chiều rộng không đổi, bạn cần "%04d"trong trường hợp nào bashhoặc zshcó thể làm gì {0001..1000}với khôngprintf
dave_thndry_085 ngày

Tính năng bổ sung: Tôi cần một cách để truyền bá các tệp này qua nhiều thư mục con được đặt tên ngẫu nhiên.
stu

10

Một biến thể với seq, xargs, ddshuf:

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

Giải thích theo yêu cầu cho mỗi bình luận:

seq -w 1 10in một dãy số từ 01 đến 10

xargs -n1 -I%thực thi lệnh sh -c 'dd ... % ...'cho mỗi số thứ tự thay thế % bằng nó

dd if=/dev/urandom of=file.% bs=$(shuf ...) count=1024tạo các tệp được cung cấp từ / dev / urandom với 1024 khối với kích thước khối

shuf -i1-10 -n1một giá trị ngẫu nhiên từ 1 đến 10


Wat làm điều này chính xác làm gì?
saruftw

1
@ saru95 giải thích thêm.
FloHimelf

Điều này tạo ra 10 tệp với kích thước ngẫu nhiên. Thay đổi "10" thành số lượng tệp mong muốn.
Nay

2

Bạn có thể làm một cái gì đó như thế này:

#!/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

Tôi đã thử làm điều này nhưng không làm việc. Bạn có thể muốn giải thích các tham số. :)
João José

rất nhanh thx @rahul
BG Bruno

2

Điều này sử dụng một đường ống dẫn duy nhất và có vẻ khá nhanh, nhưng có giới hạn là tất cả các tệp có cùng kích thước

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

Giải thích: Sử dụng dd để tạo 10240 * 1024 byte dữ liệu; chia nó thành 10240 tệp riêng biệt mỗi tệp 1k (tên sẽ chạy từ 'file.aaaa' đến 'file.zzzz')

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.