From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4549 invoked from network); 24 Jul 2005 06:44:37 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by ns1.primenet.com.au with SMTP; 24 Jul 2005 06:44:37 -0000 Received: (qmail 32494 invoked from network); 24 Jul 2005 06:44:31 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 24 Jul 2005 06:44:31 -0000 Received: (qmail 12855 invoked by alias); 24 Jul 2005 06:44:24 -0000 Mailing-List: contact zsh-users-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 9136 Received: (qmail 12846 invoked from network); 24 Jul 2005 06:44:24 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by sunsite.dk with SMTP; 24 Jul 2005 06:44:24 -0000 Received: (qmail 31403 invoked from network); 24 Jul 2005 06:44:24 -0000 Received: from vms040pub.verizon.net (206.46.252.40) by a.mx.sunsite.dk with SMTP; 24 Jul 2005 06:44:18 -0000 Received: from candle.brasslantern.com ([71.116.88.149]) by vms040.mailsrvcs.net (Sun Java System Messaging Server 6.2 HotFix 0.04 (built Dec 24 2004)) with ESMTPA id <0IK40013JDDSZOVB@vms040.mailsrvcs.net> for zsh-users@sunsite.dk; Sun, 24 Jul 2005 01:44:17 -0500 (CDT) Received: from candle.brasslantern.com (IDENT:schaefer@localhost [127.0.0.1]) by candle.brasslantern.com (8.12.11/8.12.11) with ESMTP id j6O6iGsd020427 for ; Sat, 23 Jul 2005 23:44:16 -0700 Received: (from schaefer@localhost) by candle.brasslantern.com (8.12.11/8.12.11/Submit) id j6O6iFlD020426 for zsh-users@sunsite.dk; Sat, 23 Jul 2005 23:44:15 -0700 Date: Sun, 24 Jul 2005 06:44:15 +0000 From: Bart Schaefer Subject: Re: Sorting file names randomly In-reply-to: <20050723194240.GA32416@DervishD> In-reply-to: <20050723212657.GA744@DervishD> To: Zsh Users Message-id: <1050724064415.ZM20425@candle.brasslantern.com> MIME-version: 1.0 X-Mailer: Z-Mail (5.0.0 30July97) Content-type: text/plain; charset=us-ascii References: <20050723194240.GA32416@DervishD> <20050723212657.GA744@DervishD> Comments: In reply to DervishD "Sorting file names randomly" (Jul 23, 9:42pm) Comments: In reply to DervishD "Re: Sorting file names randomly" (Jul 23, 11:26pm) X-Spam-Checker-Version: SpamAssassin 3.0.4 (2005-06-05) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.0.4 On Jul 23, 9:42pm, DervishD wrote: } } shuffle dir1/* dir2/* ... There's no reason to noglob and alias this. The space required to expand the glob on the command line is no worse than what you're doing inside the function anyway, and there aren't argument-size limits on calls to shell functions, only on external commands. } I've tried to use '$~' in the solution above (the '%0...' one), } but it doesn't work because although files in dir1 and files in dir2 } are sorted randomly, dir1 files appear always before dir2 files. It } seems that the random number doesn't affect the sorting of pathnames Right, (e:..:) is applied to the base file name, within each directory, not to the entire string being globbed. } Any simple way of using the above solution for this new problem Not really; glob qualifiers aren't going to do it for you. } Any simple way of doing the random sort on a group of patterns? You'll have to first expand them and then sort the resulting array. On Jul 23, 11:26pm, DervishD wrote: } } 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 following won't work in versions of zsh that lack the += assignment: function shuffle { emulate -L zsh integer i reply=() # set -- $~* # uncomment to use with noglob alias for ((i=1; i <= $#; ++i)) { reply[i*RANDOM/32768+1]+=($argv[i]) } shift reply print -l $reply } The use of array[index]+=(list) means we can insert stuff into the middle of the array without replacing the stuff that's there. This has the side effect that array[1] is always empty (because we always append things after it), which is why the shift is needed. So this is a true shuffle; for each "card" $argv[i], we insert it into the reply "deck" at a random position among the previous i-1 cards. A more efficient way might be this: function shuffle { emulate -L zsh declare -A h local +h -Z 5 RANDOM=$SECONDS integer i # set -- $~* # uncomment to use with noglob alias for ((i=1; i <= $#; ++i)) { h[$i.$RANDOM]=$argv[i] } reply=( $h ) print -l $reply } This creates random but unique hash keys and then retrieves the shuffled values in one assignment; we don't care that the order of hash values is indeterminate, because we want it to be random! The local RANDOM is there to force it to be zero-padded to 5 places, so all the hash keys are the same length; probably not essential. (Incidentally, I didn't test this, but I'll bet that "seeding" a local RANDOM like that ruins the repeatable sequence of the global RANDOM.) -- Bart Schaefer Brass Lantern Enterprises http://www.well.com/user/barts http://www.brasslantern.com Zsh: http://www.zsh.org | PHPerl Project: http://phperl.sourceforge.net