web-dev-qa-db-ja.com

bashでUUIDを作成する方法は?

Javaランダムに作成することが可能です [〜#〜] uuid [〜#〜]

UUID uuid = UUID.randomUUID();

バッシュでこれを行う方法?

185
raoulsson

e2fsprogs パッケージの一部であるuuidgenプログラムを参照してください。

this によると、libuuidtil-linux の一部になり、e2fsprogsへの組み込みは段階的に廃止されます。ただし、新しいUbuntuシステムでは、uuidgenが_uuid-runtime_パッケージに含まれるようになりました。

Uuidを作成して変数に保存するには:

_uuid=$(uuidgen)
_

私のUbuntuシステムでは、英字は小文字で出力され、私のOS Xシステムでは、大文字で出力されます(コメントでこれを指摘してくれたDavidに感謝します)。

すべて大文字に切り替えるには(上記のように生成した後):

_uuid=${uuid^^}
_

すべて小文字に切り替えるには:

_uuid=${uuid,,}
_

たとえば、2つのUUIDがあり、それらを大文字小文字を無視してBashで比較する場合は、次のようにtolower()スタイルの比較を実行できます。

_if [[ ${uuid1,,} == ${uuid2,,} ]]
_

Linuxで外部依存関係を追加せずに多様性を追加するには、次のようにします。

UUID=$(cat /proc/sys/kernel/random/uuid)

悪い習慣を広めるには、FreeBSDのLinux互換性レイヤー(linuxulator?)の下に、

UUID=$(cat /compat/linux/proc/sys/kernel/random/uuid)

参照:

167
Samveen

完全を期すために... DebianにはdbusパッケージでインストールされたUUIDジェネレーターもあります。先を見回して見逃しました。これはおそらくe2fsprogsパッケージと同じアルゴリズムですが、ダッシュは追加されないため、少しわかりやすいかもしれません。

$ uuidgen
387ee6b9-520d-4c51-a9e4-6eb2ef15887d

$ dbus-uuidgen
d17b671f98fced5649a856a54b51c9e6

Grawityは安全性のヒントを追加します。「DBus UUIDは RFC 4122 に関連しないか、互換性がありません。さらに、 dbus-uuidgen は常に最後の4バイトとしてUnixタイムスタンプを使用します。したがって、一部の用途には適さない可能性があります。」 (ありがとう、Grawity、マンページでそれを見つけたはずです。)

34
quack quixote

他の実行可能ファイルに依存したくない場合、またはそれらを使用できない場合は、 here の純粋なbashバージョンを以下に示します。

# Generate a pseudo UUID
uuid()
{
    local N B T

    for (( N=0; N < 16; ++N ))
    do
        B=$(( $RANDOM%255 ))

        if (( N == 6 ))
        then
            printf '4%x' $(( B%15 ))
        Elif (( N == 8 ))
        then
            local C='89ab'
            printf '%c%x' ${C:$(( $RANDOM%${#C} )):1} $(( B%15 ))
        else
            printf '%02x' $B
        fi

        for T in 3 5 7 9
        do
            if (( T == N ))
            then
                printf '-'
                break
            fi
        done
    done

    echo
}

[ "$0" == "$BASH_SOURCE" ] && uuid
20
noway

私は、uuidgenが利用できない場合に、このスクリプト「ワンライナー」が役立つことを発見しました。これにより、PerlまたはPython用の外部モジュールをインストールする必要もなくなります。

od -x /dev/urandom | head -1 | awk '{OFS="-"; print $2$3,$4,$5,$6,$7$8$9}'

SnowLeopard、Red Hat Valhalla、Solaris 9 4/04以降でのテストに成功。これが非一意性になりやすいかどうか私は知りたいのですが、過去10年間に「噛まれ」ていません。もちろん、head -1head -_other-value_ | tail -1に置き換えることができます。

説明する、

/dev/randomおよび/dev/urandomはカーネルランダムジェネレーターです。

od(8進ダンプ)には、16進出力スイッチ(-x)があり、1行あたり16バイトを生成します。

head -n [| tail -1](n> 0)は、前の出力の1行だけを抽出します。

awkは、印刷ステートメントでコンマが出現するすべての場所で、OutputFieldSeparatorをハイフンに設定します。フィールド2から9を個別に指定することにより、ハイフンを制御し、 'od'が出力の各行の先頭に付けるインデックス/オフセットカウンターを取り除きます。

結果は8-4-4-4-12小文字a-f0-9のパターンになります。

993bb8d7-323d-b5ee-db78-f976a59d8284
19
dan

ちょうどpythonは取り残された感じがしません:

python  -c 'import uuid; print uuid.uuid1()'
2d96768e-02b3-11df-bec2-001e68b9d147

シェルで使用するには:

myvar=$(python  -c 'import uuid; print uuid.uuid1()')

生成できるUUIDの種類については Python Documentation UUID を参照してください。

非systemdマシンでsystemd machine-id互換ファイルを生成するには、pythonを使用して次のようにします。

python -c 'import re; import uuid; print re.sub("-","",str(uuid.uuid4()))' \
 > /etc/machine-id
14
davey

Perlは、_e2fsprogs_パッケージに基づくUUIDライブラリを提供します。私のDebianシステムでは、これは_libuuid-Perl_パッケージです。以下は、ワンライナーの例です。詳しくは_man uuid_をご覧ください:

_$ Perl -e 'use UUID;  UUID::generate($uuid);  UUID::unparse($uuid, $string);  print "my new UUID is $string \n";'
my new UUID is 3079e9ce-41d4-4cf3-9f90-d12f8bb752e4
_

これは、バッククォートまたは$()表記を使用してシェルスクリプトに追加するのは簡単です。

_#!/bin/bash
# ...do some stuff
$myvar = $(Perl -e 'use UUID;  UUID::generate($uuid);  UUID::unparse($uuid, $string);  print "$string";')
# ...do some more stuff
_
11
quack quixote
apt-get install uuid

私のために働いた後、私はuuidを実行しました

3
Joseph

一部はここに到着し、スクリプトで使用する一意のIDを生成する簡単な方法を探しているだけです。本当のUUIDである必要はありません。

その場合、次のようにするだけで、秒まで一意のIDが生成されます。これを1秒以内に複数回実行しても、同じ結果が得られます。

MYID="U$(date +%s)"
echo $MYID

現在のシステム時刻に基づいて、次のようなIDを生成します。

U1454423662

注:Linuxを使用している場合、またはMacにCoreutilsをインストールしている場合は、次を使用してナノ秒の一意のIDを生成できます。

MYID="U$(date +%s%N)"
echo $MYID

または、pythonベースのソリューションをナノ秒まで下げたい場合は、ほぼどこでも機能するはずです。実行します。

MYUID=U$(python -c'import time; print repr(time.time())')
echo $MYUID
1
Brad Parks

このスレッドには、さまざまな例があり、本当に役に立ちました。さまざまな環境のuuid関数が必要になることがよくあります。純粋なbashの例は大好きですが、別の言語のライブラリを使用する方が便利な場合もあります。

したがって、完全を期すために、Ruby(1.9.3+)には、いくつかの便利なハッシュ関数とID関数を含むSecureRandomモジュールが組み込まれています。bashcliから、これを行うことができます。

Ruby -r securerandom -e 'puts SecureRandom.uuid'
1
wbr

OSSP UUIDライブラリ( http://www.ossp.org/pkg/lib/uuid/ )を確認し、インストールを検討してください。一部のプロジェクトではオプションとして提供されています(PostgreSQLなど)。 バージョン3およびバージョン5のUUIDを適切に処理します。これは、私のインストール済み(e2fsprogsなど)ライブラリが処理できる範囲を超えていました。さいわい、openSUSEのメインリポジトリの1つにあります。 Windows(Cygwinなど)またはMySQLで動作するバージョンを取得するのは失敗です。 Linux/PostgreSQL/Pythonに切り替えるときがきたようです(v3とv5のUUIDが本当に必要なので、MySQL/MariaDBへのSQLyog GUIをとても気に入っていました)。

1
user2351170

私はPythonを使用して任意の数のUUIDをまとめて生成するための小さなBash関数を書きました:

# uuid [count]
#
# Generate type 4 (random) UUID, or [count] type 4 UUIDs.
function uuid()
{
    local count=1
    if [[ ! -z "$1" ]]; then
        if [[ "$1" =~ [^0-9] ]]; then
            echo "Usage: $FUNCNAME [count]" >&2
            return 1
        fi

        count="$1"
    fi

    python -c 'import uuid; print("\n".join([str(uuid.uuid4()).upper() for x in range('"$count"')]))'
}

小文字を使用する場合は、次のように変更します。

python -c 'import uuid; print("\n".join([str(uuid.uuid4()).upper() for x in range('"$count"')]))'

に:

python -c 'import uuid; print("\n".join([str(uuid.uuid4()) for x in range('"$count"')]))'
1
Will
ran=`od -X -A n /dev/random | head -1 | cut -c3-38`

correlation_id=`echo ${ran} | cut -c1-8`-`echo ${ran} | cut -c10-13`-`echo ${ran} | cut -c14-17`-`echo ${ran} | cut -c19-22`-`echo ${ran} | cut -c23-26``echo ${ran} | cut -c28-35`
0
andyfff