The classic procmail recipe for (reasonably) safe automatic mailing list filtering is

:0
* ^List-Id:[^<]+<\/[a-z0-9-.]+
$MAILDIR/MATCH/

This relies on mailing lists being configured such that the first part of the ID, up to the first dot, is a good identifier for the list. this is not always the case (*.lists.fedoraproject.org, I'm looking at you). Removing the dot from the expression above means you end up with unambiguous, albeit long, folder names (devel.lists.fedoraproject.org).

If you access this mail over IMAP, you have another problem: the dots create a nested folder heirarchy that probably doesn't make any sense (devellistsfedoraprojectorg). It's possible to change the configuration of IMAP clients and servers to use a different delimiter, but this is not an oft travelled road, and I don't feel like finding the pot holes. Better to substitute the dot for something else. I'd recommend an ASCII character, Unicode seems to throw up a whole bunch of client problems.

Here's a variation that solves the problem:

:0
* ^List-Id:[^<]+<\/[a-z0-9-.]+
{
  :0
  subst=| echo "$MATCH" | tr . :

  :0
  $MAILDIR/$subst/
}

At the cost of elegance, you can add rules to give friendlier names to lists from folks who have well-defined list-ids (integration left as an exercise to the reader):

:0
* ^List-Id:.*debian.*lists\.debian\.org
subst=| echo "$MATCH" | sed 's/\([A-Za-z0-9-]\+\)\..*/\1/'

Finally, there are some "lists" you probably don't want to file in their own individual folders. Inject these into the top-most rule:

* ! ^List-Id.*groups\.facebook\.com

Finally thanks to Brett for showing me some exim filter snippets that would let me implement the above in a (slightly) nicer looking way. Sadly I think I'm stuck with procmail for some other features I use, but it's been a while since I looked.