web-dev-qa-db-ja.com

ターミナルを使用して大きなファイルを作成する

テストの目的で、一意の単語(厳密には繰り返さない)を含める必要がある非常に大きなサイズのファイルを作成します。 GB、TBなどで指定できます。端末でこれを行うことはできますか?

buntu 16.04 (Xenial Xerus)を使用しています。

7
Avani badheka

無限数の単語を作成し、一意を保証

以下のスクリプトは、アルファベットの文字から保証された一意の単語を生成します。固定長の文字の問題は、limitedの可能性のセットを生成し、ファイルのサイズを制限することです。

したがって、pythonpermutationsを使用しました。これにより、(有限の)一意の単語が生成されます。 ただしすべての組み合わせを使用した後、最初からやり直し、単語2、3、4、n回などを印刷します。nのすべての値は新しいものを作成しますユニークな言葉。したがって、100%確かに一意の単語を生成するジェネレーターがあります。

スクリプト:

import itertools
import string

ab = [c for c in string.ascii_lowercase]

t = 1
while True:   
    for n in range(1, len(ab)+1): 
        words = itertools.permutations(ab, n)
        for Word in words:
            print(t*("".join(Word)))
    t += 1

使い方

  • スクリプトを空のファイルにコピーし、unique_generator.pyとして保存します
  • 次のコマンドで実行します:

    python3 /path/to/unique_generator.py > /path/to/bigfile.txt
    

注意

スクリプトは、さまざまな長さの一意の単語を生成します。必要に応じて、行を変更することにより、開始または最大長を設定できます。

for n in range(1, len(ab)+1)

(範囲の開始を置き換えます)、および変更:

while True:  

into(例えば):

while t < 10:   

最後のケースでは、単語の長さはアルファベットの最大10倍です。

プロセスを終了する

  • 端末から実行する場合は、単に Ctrl+C
  • そうでなければ:

    kill $(pgrep -f /path/to/unique_generator.py)
    

    仕事をする必要があります。

12
Jacob Vlijm

文字のランダムな行を作成する最も簡単なワンライナー:

while true; do echo $RANDOM | base64 >> BIGFILE.txt  ; done

または、代わりに:

while true; do echo $RANDOM | sha512sum  >> BIGFILE.txt ; done   

一意性を高めるには、/dev/urandomを使用できます。

cat /dev/urandom | base64 

ファイルが目的のサイズに達したら、Ctrl + Cでコマンドを終了します

ランダム文字列/パスワードジェネレータ も考慮してください:

したがって、そこの答えの1つは、これを持つように適応させることができます:

while true; do openssl Rand -base64 20 ; done

句読点や数字を使用したくないが、文字のみを使用する場合は、trを使用して修正できます。

while true; do openssl Rand -base64 20 | tr -d '[[:digit:]][[:punct:]]'  ; done 

ランダム性を高めるには、shufを使用して、生成された文字列の文字をシャッフルできます。

while true; do openssl Rand -base64 20 | fold -w1 | shuf | tr -d '\n' ; done

などなど。出力をbase64またはsha256sumコマンドの別のセットに渡して、さらにランダムにすることもできます。

シェル以外の代替言語が好きな人のために、ここにpythonワンライナーがあります:

python -c $'import string,random;i = [i for i in string.uppercase + string.lowercase + string.digits];\nwhile not random.shuffle(i): print "".join(i)'
6

ランダムな単語でいっぱいの大きなファイルを取得するには、次のコマンドを使用します。

cat /dev/urandom | head -c 1000000 | tr -dc "A-Za-z0-9\n" | sort | uniq

これにより、各行に一意のWordとランダムテキストの文字列を含むファイルが作成されます。 1000を大きくまたは小さくすることで、ファイルのサイズを大きくすることができます。各カウントは約1バイトに相当します。

単語をスペースで区切るには、単にtr "\n" " "を介してそれらを返します。

cat /dev/urandom | head -c 1000000 | tr -dc "A-Za-z0-9\n" | sort | uniq | tr "\n" " "

これにより、シェルのループに関連するパフォーマンスの問題も回避されます。

6
DonyorM

Linuxで/proc/sys/kernel/random/uuidを使用して IDs を生成することもできます。これは一意であることが保証されている必要があります。

[~]$ for i in {1..10}; do cat /proc/sys/kernel/random/uuid; done
c8072c40-32f5-4f14-8794-c3ab68e1a0f5
2f2630d8-0e17-4cba-8e62-586ee23f0ebb
97606886-f227-46f6-827a-141b0db57c59
5ffea57c-c3bf-4ba6-8c08-8a1b29ee8f6c
2b90f797-2def-4433-ae71-6f404db944fc
fcb793e9-6102-472d-a7a0-7bf5204dbee5
d84e2877-6804-4bed-85f0-0a551234425a
3d9445ca-335c-4960-83d5-6cb1bef8b9eb
913bce71-5c20-47f7-a22e-277be6856a57
8f232541-f8c1-46ba-b57a-0d11314c3483

-tr -dの文字を削除してから、これをファイルにリダイレクトできます。

[~]$ for i in {1..10000}; do cat /proc/sys/kernel/random/uuid | tr -d '-' ; done > /tmp/words
[~]$ sort /tmp/words | uniq | wc -l
10000
3
Nykakin

限られたアルファベットと非常に予測可能な出力が問題ない場合、おそらく次の答えが最も速い(そして最もゴルフが多い:P)答えです:

seq 100

(単語が数字だけで構成されている場合)、または:

seq 100 | tr 0-9 A-I

(実際の文字を使用したい場合)。

3
liori