I had a massive directory of files that I wanted to pick a few random files to test before I imported the whole set. For this post lets say I want 100 random files from some_dir and moving them to this_dir.

First you could use:

$ LIST=$(ls -1 ./some_dir | sort -R | tail -n 100)

but coreutils provides a shuffle program...

$ LIST=$(ls -1 ./some_dir | shuf -n 100)

From there you can copy the files using

$ for i in $LIST; do echo $i; cp "./some_dir/$i" ./this_dir/; done

Substituting in our variable:

$ for i in $(ls -1 ./some_dir | shuf -n 100); do echo $i; cp "./some_dir/$i" ./this_dir/; done

But that line looks messy because the source directory has to be repeated.

I think this one looks better, but to use this we can to use find to output the relative path:

for i in $(find ./some_files/ -print -type f | shuf -n 10); do echo $i; cp "$i" ./this_dir/; done

Next we can throw that in a function:

cp_rand_subset ()
{
        for i in $(find $2 -print -type f | shuf -n $1); do echo $i; cp "$i" $3; done
}

And after defining it call it like:

cp_rand_subset 100 some_dir this_dir

Or

cp_rand_subset 57 ./lots_files /home/share/samples/