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
 
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:
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