Wie wählt man in Bash zufällig eine Datei aus einer statischen Liste aus?

937
Eukleyv Cardoso

Ich habe dieses Bash-Skript

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

Wie kann ich diesen Prozess randomisieren?

0

2 Antworten auf die Frage

0
James T Snell

Ich habe das Gefühl, dass diese Frage eine Hausaufgabe ist. Lass mich das für dich tun.

*in diesem Skript wird wahrscheinlich eine alphabetische Liste eines Verzeichnisses zurückgegeben. So können Sie diese Auflistung abfangen und an diesem Punkt randomisieren.

Sie können auch den Inhalt des Verzeichnisses in ein Array laden, eine zufällige Zahl auswählen - die Arraygröße ändern. Wenn das Ergebnis leer ist, können Sie vorwärts blättern, bis Sie einen nicht leeren Eintrag treffen. Leeren Sie dann diesen Eintrag, wenn Sie ihn verbrauchen. Sie benötigen einen Zähler oder etwas, um zu verfolgen, wie viele Elemente Sie verwendet haben, damit Sie wissen, wann Sie alle Einträge verbraucht haben.

Außerdem können Sie die Einträge stattdessen in eine Liste wie eine verknüpfte Liste laden und mit einem zufälligen Eintrag # beginnen, den sie verbrauchen, und dann aus der Datenstruktur verwerfen.

Es gibt wahrscheinlich viele andere Möglichkeiten. Aber ich habe Ihnen nur Skizzen für 3 grobe Ansätze gegeben. Sicher, ich habe keinen Code für Sie geschrieben, aber ich habe den schwierigen Teil gemacht. Bitte ;)

Nein, es sind keine Hausaufgaben. Ich bin ein Künstler, der sich mit Linux noch nicht auskennt und eine Diashow benötigt, mit der ich die Verzögerung zwischen Bildern steuern und sie für Gestenzeichnungen randomisieren kann. Ich habe dieses Skript aus diesem Thread kopiert: http://superuser.com/a/212838/458779. Ich habe es hier gepostet, um um Hilfe zu bitten, da ich in diesem Thread nicht kommentieren darf. Ich weiß also nichts. Eukleyv Cardoso vor 8 Jahren 0
0
Carlos Sánchez de La Lama

Folgendes sollte AFAIK auf jedem POSIX-System funktionieren.

Eine zufällig geordnete Liste von Dateien kann abgerufen werden mit:

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

Erläuterung:

  • for i in *; do echo "$i"; done gibt eine Liste von Dateien, eine pro Zeile.
  • awk 'BEGIN { OFS="\t"; srand (); } { print rand (), $0 }' fügt jeder Zeile ein Feld mit einer Zufallszahl im Bereich [0,1) hinzu.
  • sort Sortiert diese Zufallszahl als Index und ordnet die Dateiliste daher zufällig ein.
  • cut -f2- entfernt das Zufallszahlenfeld.

Der ursprüngliche Befehl (Kopieren und Schlafen) kann dann wie folgt aufgebaut werden:

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 

Natürlich können Sie Backslashes und Zeilenumbrüche entfernen, wenn Sie Einzeiler mögen;)