Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Sorting file names randomly
- X-seq: zsh-users 9134
- From: DervishD <zsh@xxxxxxxxxxxx>
- To: Zsh Users <zsh-users@xxxxxxxxxx>
- Subject: Re: Sorting file names randomly
- Date: Sat, 23 Jul 2005 23:26:57 +0200
- In-reply-to: <20050723194240.GA32416@DervishD>
- Mail-followup-to: Zsh Users <zsh-users@xxxxxxxxxx>
- Mailing-list: contact zsh-users-help@xxxxxxxxxx; run by ezmlm
- Organization: DervishD
- References: <20050723194240.GA32416@DervishD>
Hi all :) and sorry for self-replying...
* DervishD <zsh@xxxxxxxxxxxx> dixit:
> A time ago (zsh-workers/19128) Bart explained me how to sort
> randomly a group of files. Namely, the solution is this:
>
> array=(*(e:'reply=%0(l..$RANDOM)$REPLY:))
> array=(${(%)array)
[...]
> Well, the problem is that the above doesn't work if you have to
> use more than one pattern, because the '(e' construct will affect
> only the last element. Since I don't know how many elements will be
> present, I cannot use an '(e' construct on each element. Moreover it
> would be very messy.
I've written a not very good solution that at least works:
function shuffle () {
emulate -L zsh
setopt nullglob globdots rcexpandparam
RANDOM=`date +%s`
[[ $# -eq 0 ]] && set '*'
reply=($~*(e:'REPLY="${(l.5..0.)RANDOM} $REPLY"':))
reply=(${(o)reply})
reply=(${reply/#????? /})
print -l $reply
return 0
}
alias shuffle="noglob 'shuffle'"
The function returns the list in the 'reply' array parameter, and
prints it on stdout.
If anybody can make it better/shorter, suggestions are welcome ;)
The three array assignments can be probably shortened.
Raúl Núñez de Arenas Coronado
--
Linux Registered User 88736 | http://www.dervishd.net
http://www.pleyades.net & http://www.gotesdelluna.net
It's my PC and I'll cry if I want to...
Messages sorted by:
Reverse Date,
Date,
Thread,
Author