Создать много файлов со случайным контентом

23

Я ищу команду для создания нескольких (тысяч) файлов, содержащих не менее 1 КБ случайных данных.

Например,

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

Как я могу создать много файлов, как это?

Жоао Жозе
источник
Что вы имели в виду под «эксклюзивом»? Это не имеет смысла в контексте, поэтому вы, вероятно, использовали не то слово.
Жиль "ТАК - перестань быть злым"
Я имел в виду, что файлы не могут иметь одинаковый контент.
Жоау Жозе
Таким образом, эксклюзив означал бы уникальный.
Somehume

Ответы:

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}).

lcd047
источник
2
Это необходимо bashпо многим причинам, в том числе $((…))и $RANDOM. Даже $(…)не может существовать в каждой оболочке.
G-Man говорит: «Восстановите Монику»
1
@ G-Man, в любом случае, ни один из этих признаков не являются специфическими для при bashэтом они не происходят в bash ( {1..1000}происходит от zsh, for n in...; doneи расширения переменной происходит от Bourne оболочки $(...), $((...))и $RANDOM приходят Ksh). Функции, которые не являются POSIX {1..1000}, $RANDOMи /dev/urandom.
Стефан
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

FloHimself
источник
Ват это точно делает?
Саруфтв
1
@ saru95 объяснение добавлено.
FloHimself
Это создает 10 файлов со случайным размером. Измените «10» на количество желаемых файлов.
Нет
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
Рахул
источник
Я пытался сделать это, но не сработало. Возможно, вы захотите объяснить параметры. :)
Жоао Жозе
очень быстро, спасибо @rahul
Б.Г. Бруно
2

Это использует один конвейер и кажется довольно быстрым, но имеет ограничение, что все файлы имеют одинаковый размер

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

Объяснение: Используйте dd для создания 10240 * 1024 байтов данных; разделите это на 10240 отдельных файлов по 1 КБ (имена будут проходить от 'file.aaaa' до 'file.zzzz')

Эд Рэндалл
источник