Bashで、静的リストからファイルをランダムに選択する方法


0

私はこのbashスクリプトを持っています

while true ; do for i in * ; do cp "$i" ~/slideshow.jpg ; echo $i ; sleep 5 ; done ; done

このプロセスを無作為化するにはどうすればいいですか?

回答:


0

この質問は宿題です。私はあなたのためにそれをしましょう。

* そのスクリプトでは、ディレクトリのアルファベット順のリストが返されている可能性があります。だからあなたはそのリストを傍受し、その時点でランダム化することができます。

ディレクトリの内容を配列にロードし、ランダムに数字を選ぶこともできます - 配列サイズを変更し、結果が空の場合は、空でないエントリが見つかるまで先に進みます。それからあなたがそれを消費するようにそのエントリーを空にする。あなたがすべてのエントリーをいつ消費したかを知るためにあなたがそれからあなたがあなたがどれほど多くの要素を使ったかを追跡するためにカウンターか何かが必要である。

さらに、代わりにエントリをリンクリストのようなものにロードして、ランダムなエントリを作成して#消費してからデータ構造から破棄することもできます。

他にも多くの選択肢があります。しかし、私はあなたに3つの大まかなアプローチのためのスケッチを与えました。確かに私はあなたのためにコードを書かなかったが、私は ハード 部。どういたしまして ;)


いいえ、それは宿題ではありません。私はLinuxの初心者で、私はイメージ間の遅延を制御し、それをジェスチャー描画のためにランダム化することを可能にするスライドショーの必要性があるアーティストです。このスレッドからそのスクリプトをコピーしました superuser.com/a/212838/458779 私はそのスレッドにコメントすることを許可されていないので、私は助けを求めるためにそれをここに投稿しました。だから、私は何も知りません。
Eukleyv Cardoso

0

以下は、どのPOSIXシステムでもうまくいくはずです。

ファイルのランダムな順序付きリストは、次のコマンドで取得できます。

for i in *; do echo "$i"; done |                              \
  awk 'BEGIN { OFS="\t"; srand (); } { print rand (), $0 }' | \
  sort |                                                      \
  cut -f2-

説明:

  • for i in *; do echo "$i"; done ファイルのリストを1行に1つずつ表示します。
  • awk 'BEGIN { OFS="\t"; srand (); } { print rand (), $0 }' [0,1)の範囲の乱数を持つフィールドを各行に追加します。
  • sort その乱数をインデックスとして使用してソートするので、ファイルリストがランダム化されます。
  • cut -f2- 乱数フィールドを削除します。

元のコマンド(コピーとスリープを伴う)は、次のように構成できます。

for i in $(for i in *; do echo "$i"; done |                              \
             awk 'BEGIN { OFS="\t"; srand (); } { print rand (), $0 }' | \
             sort |                                                      \
             cut -f2-);                                                  \
do                                                                       \
  cp "$i" ~/slideshow.jpg;                                               \
  echo "$i";                                                             \
  sleep 5;                                                               \
done

もちろん、ワンライナーが好きなら、バックスラッシュと改行を削除することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.