Wow, I was making this way too complicated. :) Thanks.
Here's what I ended up with:
Code:
#!/bin/bash
destdir="/media/akml01/ml/by-alphabet"
srcdir="/media/akml01/ml/main"
die() { echo "$(color red)$1$(color off)"; exit 1; }
rm -rf $destdir/* \
|| die "Failed to clear $destdir/"
for item_src in $srcdir/*; do
item="$(basename "$item_src")"
letter="$(echo "$item" | tr -c "[:alnum:]" 1 \
| tr "[:digit:]" 1 \
| tr "[:upper:]" "[:lower:]" \
| cut -c1)" \
|| die "Failed to index $item_src"
echo "$letter: $item_src"
mkdir --parents $destdir/$letter \
|| die "Failed to make directory $destdir/$letter"
ln --symbolic --target-directory="$destdir/$letter/" "$item_src" \
|| die "Failed to link to $item in $destdir/$letter/"
done
I made the sort case-insensitive and shoved all numbers, punctuation, and nonstandard characters into the "1" subfolder.