web-dev-qa-db-ja.com

ディレクトリ内のファイルの名前をランダムに生成された名前に変更するにはどうすればよいですか?

名前が異なる長さのファイルがたくさんあります。これらのファイルの拡張子はjpegです。

ファイルの名前をランダムに生成された名前に変更するにはどうすればよいですか?

2
Denis

次のファイルがあるディレクトリで実行します。

for file in *.jpeg; do
    mv -- "$file" "$RANDOM.jpeg"
done

ただし、ランダムな名前が競合する可能性があります$RANDOMは0〜32767の数値のみを提供します。

pbhj のおかげでより良い解決策:

for file in *.jpeg; do
    mv -- "$file" "$(mktemp --dry-run XXXXXXXX.jpeg)"
done

ランダムな名前が競合する可能性はまだありますが、mktempの8文字の英数字で大幅に小さくなっています。矛盾がないことを保証するために Anselmoの答え を参照してください。

3
wjandrea

RANDOMの使用は限定的なアプローチです。 BASH manから: "RANDOMこのパラメーターが参照されるたびに、0〜32767のランダムな整数が生成されます。"だから... 32768ファイル以下! :)

もう1つの大きな問題は、繰り返しの可能性です。ご覧のとおり、繰り返しの問題はランダムジェネレーターの使用に影響を与えますが、発生する確率は異なります。

Mktempを使用する方がはるかに優れたソリューションになる可能性がありますが、-dry-runパラメータを使用しないでください。これにより、名前が生成されますが、その名前のファイルが存在しないことは保証されません。この方法で使用すると、一種のランダムジェネレーターにすぎません。

だから、私の簡単な提案は:

for file in *.jpeg; do
    new_file="$(mktemp XXXXXXXX.jpeg)"
    mv -f -- "$file" "$new_file"
done

一歩一歩。

new_file="$(mktemp XXXXXXXX.jpeg)"

Mktempをそのように実行すると、ランダムな繰り返しを考慮して、新しいランダムな名前でファイルが安全に作成されます。また、作成されたファイルの名前を出力します。これは、new_fileでキャッチします。

mv -f -- "$file" "$new_file"

-fを指定してmvを実行すると、イメージの名前を変更して、new_fileが上書きされます。

これは、次のようにmultiple _$RANDOM_ sを指定することで、類似した名前のファイル名が取得されないという大きな確信を持って簡単に行うことができます。

_for file in *.jpeg; do
    mv -- "$file" "$RANDOM-$RANDOM-$RANDOM.jpeg"
done
_

上記の例では、同じ名前を取得できる可能性は1/(32767)^3です。

0
Amir