Random Shell-Script

Hi,
hat jmd ne idee wie Ich folgendes realisieren kann?

Ein Script was einen Ordner durchsucht und dann Zufällig eine Datei auswählt.

thx

servus

robsn
 
Hi,
er bringt ne fehler meldung
shuffle: not found

Muss ich noch ein extra packet für sowas Installiern?
 
Hmm... in Shell ist das ziemlich heikel. Das folgende skript ist langsam, und funktioniert nicht, wenn newlines im Dateinamen vorkommen.

Code:
#!/bin/sh

rand() {
  dd if=/dev/urandom bs=1 count=4 2>/dev/null | od -D | awk '{print $2; exit}'
}

find "$1" -type f | while IFS= read i
do
  echo `rand` "$i"
done | sort -n | head -1 | sed 's/^[^ ]* //'

Was besseres faellt mir in shell nicht ein :) In Perl waer das ein Einzeiler.
 
Zuletzt bearbeitet:
Original geschrieben von robsn
Hi,
er bringt ne fehler meldung
shuffle: not found

Muss ich noch ein extra packet für sowas Installiern?

Hmm, bei NetBSD ist das standardmäßig dabei. shuffle permutiert die Argumente beliebig...
 
@robsn: ok, ist NetBSD-spezifisch... (seit 1.4 dabei), dann kommt für Dich die /dev/urandom Variante infrage
 
Auf jeden, wenn auch Verzeichnisse berücksichtigt werden sollen...
Ursprgl. wollte ich noch [ -f $x ]; abtesten... deshalb die for-Schleife, aber im Eifer des Gefechts :)
 
script.sh:
Code:
#! /bin/sh
BUF=""
for x in *
do
        BUF="$BUF $x"
done
./test.pl $BUF


für perl 5.8
test.pl:
Code:
#! /usr/bin/perl
use List::Util 'shuffle';
@shuffled=shuffle(@ARGV);
print $shuffled[int(rand(@shuffled))];

der aufruf dann einfach mit ./script.sh
 
schöner:
(nur 1 script:)

Code:
#! /bin/sh
BUF=""
for x in *
do
        BUF="$BUF $x"
done
perl -e 'use List::Util "shuffle";@shuffled=shuffle(@ARGV);print $shuffled[int(rand(@shuffled))];' $BUF


UND hier die lösung für perl 5.6...
Code:
#! /bin/sh
BUF=""
for x in XXXXXXXX
do
                BUF="$BUF $x"
done

perl -e 'sub shuffle{ my $array=shift; my $i; for($i=@$array; $i--; ){ my $j = int rand($i); @$array[$i,$j]=@$array[$j,$i]; print STDERR "\$i=$i"; } } @shuffled=@ARGV; shuffle(@shuffled); print $shuffled[int(rand(@shuffled))];' $BUF



*keine garantie auf irgendwas*

nicht vergessen for x in XXXXXXXX an den entsprechenden pfad anpassen!
 
Zuletzt bearbeitet:
ich benutz zur zeit immer sowas (unter OpenBSD):

Code:
COUNT=$(ls | wc -l)
RAND_NUM=$(expr $(/usr/games/random -e ${COUNT}; echo $?) + 1)
#dann z.b.:
ls | head -${RAND_NUM} | tail -1

bevor ich mir /usr/games/random angesehen hatte, hab ich nen python einzeiler benutzt:
Code:
randomvar() {
  python -c "import random; print random.randrange(1,$1)"
}

auf bald
oenone
 
Original geschrieben von Hustenbonbon

UND hier die lösung für perl 5.6...
Code:
#! /bin/sh
BUF=""
for x in XXXXXXXX
do
                BUF="$BUF $x"
done

perl -e 'sub shuffle{ my $array=shift; my $i; for($i=@$array;
$i--; ){ my $j = int rand($i); @$array[$i,$j]=@$array[$j,$i];
print STDERR "\$i=$i"; } } @shuffled=@ARGV; shuffle(@shuffled); 
print $shuffled[int(rand(@shuffled))];' $BUF

Dir ist klar was du da machst? Du shufflest ein Array und waehlst dann ein zufaelliges Element aus dem Array. Das ist unnoetig. Und wenn man schon Perl hat, kann man gleich alles in Perl machen, dann funktioniert das auch mit beliebigen Dateinamen.
Code:
perl -le '@x=<$ARGV[0]/*>; print $x[rand(@x)]' /var/log
 
Zuletzt bearbeitet:
Zurück
Oben