Utwórz wiele plików z losową zawartością

23

Szukam polecenia do utworzenia wielu (tysięcy) plików zawierających co najmniej 1 KB losowych danych.

Na przykład,

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

Jak mogę utworzyć wiele takich plików?

João José
źródło
Co miałeś na myśli przez „ekskluzywny”? W kontekście nie ma to sensu, więc prawdopodobnie użyłeś niewłaściwego słowa.
Gilles „SO- przestań być zły”
Miałem na myśli, że pliki nie mogą mieć tej samej zawartości.
João José
Wyłączność oznaczałaby więc wyjątkowość.
somehume

Odpowiedzi:

25

Ponieważ nie masz żadnych innych wymagań, coś takiego powinno działać:

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

(wymaga to bashprzynajmniej {1..1000}).

lcd047
źródło
2
Jest to potrzebne bashz wielu powodów, w tym $((…))i $RANDOM. Nawet $(…)może nie istnieć w każdej powłoce.
G-Man mówi „Przywróć Monikę”
1
@ G-Man, w każdym razie, żadna z tych cech nie jest specyficzna bashani nie pochodzi od bash ( {1..1000}pochodzi z zsh, for n in...; donea zmienna ekspansja pochodzi z powłoki Bourne'a $(...), $((...))i $RANDOM chodź ksh). Funkcje, które nie są POSIX {1..1000}, $RANDOMoraz /dev/urandom.
Stéphane Chazelas
1
Jeśli chcesz, aby 1..1000 było stałej szerokości, potrzebujesz "%04d"w takim przypadku bashlub zshmożesz zrobić {0001..1000}bezprintf
dave_thompson_085
Dodatkowa funkcja: Potrzebuję sposobu na rozłożenie tych plików na wiele losowo nazwanych zagnieżdżonych podkatalogów.
stu
10

Odmiana z seq, xargs, ddi shuf:

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

Wyjaśnienie zgodnie z żądaniem dla komentarzy:

seq -w 1 10wypisuje ciąg liczb od 01 do 10

xargs -n1 -I%wykonuje polecenia sh -c 'dd ... % ...'dla każdej liczby sekwencji zastępując % z nią

dd if=/dev/urandom of=file.% bs=$(shuf ...) count=1024tworzy pliki podawane z / dev / urandom z 1024 blokami o rozmiarze bloku

shuf -i1-10 -n1losowa wartość od 1 do 10

FloHimself
źródło
Wat to dokładnie robi?
saruftw
1
Dodano wyjaśnienie @ saru95.
FloHimself
To tworzy 10 plików o losowym rozmiarze. Zmień „10” na liczbę wymaganych plików.
Nay
2

Możesz zrobić coś takiego:

#!/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
źródło
Próbowałem to zrobić, ale nie zadziałało. Możesz wyjaśnić parametry. :)
João José
bardzo szybko dzięki @rahul
BG Bruno
2

Korzysta z jednego potoku i wydaje się dość szybki, ale ma ograniczenie polegające na tym, że wszystkie pliki mają ten sam rozmiar

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

Objaśnienie: Użyj dd, aby utworzyć 10240 * 1024 bajtów danych; podzielić to na 10240 osobnych plików o wielkości 1k każdy (nazwy będą się zaczynać od „file.aaaa” do „file.zzzz”)

Ed Randall
źródło