私はこのbashスクリプトを持っています
while true ; do for i in * ; do cp "$i" ~/slideshow.jpg ; echo $i ; sleep 5 ; done ; done
このプロセスを無作為化するにはどうすればいいですか?
私はこのbashスクリプトを持っています
while true ; do for i in * ; do cp "$i" ~/slideshow.jpg ; echo $i ; sleep 5 ; done ; done
このプロセスを無作為化するにはどうすればいいですか?
回答:
この質問は宿題です。私はあなたのためにそれをしましょう。
*
そのスクリプトでは、ディレクトリのアルファベット順のリストが返されている可能性があります。だからあなたはそのリストを傍受し、その時点でランダム化することができます。
ディレクトリの内容を配列にロードし、ランダムに数字を選ぶこともできます - 配列サイズを変更し、結果が空の場合は、空でないエントリが見つかるまで先に進みます。それからあなたがそれを消費するようにそのエントリーを空にする。あなたがすべてのエントリーをいつ消費したかを知るためにあなたがそれからあなたがあなたがどれほど多くの要素を使ったかを追跡するためにカウンターか何かが必要である。
さらに、代わりにエントリをリンクリストのようなものにロードして、ランダムなエントリを作成して#消費してからデータ構造から破棄することもできます。
他にも多くの選択肢があります。しかし、私はあなたに3つの大まかなアプローチのためのスケッチを与えました。確かに私はあなたのためにコードを書かなかったが、私は ハード 部。どういたしまして ;)
以下は、どの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
もちろん、ワンライナーが好きなら、バックスラッシュと改行を削除することができます。