Article 4874 of comp.lang.perl:
Xref: feenix.metronet.com comp.mail.misc:2958 comp.mail.elm:2708 comp.mail.headers:219 comp.mail.mh:891 comp.mail.sendmail:2049 comp.lang.perl:4874 comp.os.linux:35157 comp.os.minix:1611 comp.unix.misc:3311 comp.unix.admin:4661 comp.unix.shell:3478
Newsgroups: comp.mail.misc,comp.mail.elm,comp.mail.headers,comp.mail.mh,comp.mail.sendmail,comp.lang.perl,comp.os.linux,comp.os.minix,comp.unix.misc,comp.unix.admin,comp.unix.shell
Path: feenix.metronet.com!news.utdallas.edu!convex!convex!darwin.sura.net!spool.mu.edu!agate!boulder!wraeththu.cs.colorado.edu!tchrist
From: Tom Christiansen <[email protected]>
Subject: Re: Conversion /etc/passwd --> /usrc/lib/aliases ?
Message-ID: <[email protected]>
Followup-To: comp.lang.perl
Originator: [email protected]
Sender: [email protected] (The Daily Planet)
Nntp-Posting-Host: wraeththu.cs.colorado.edu
Reply-To: [email protected] (Tom Christiansen)
Organization: University of Colorado, Boulder
References: <[email protected]>
Date: Tue, 10 Aug 1993 10:10:01 GMT
Lines: 82

[Note followup-to, which may or may not be appropriate.]

From the keyboard of [email protected] (Wim van Dorst/Prof. Penninger):
:I know there is a nifty little program (shell/perl script?) that turns the
:Personal Name information in the /etc/passwd file into /usr/lib/aliases
:entries for mail programs.  This will greatly enhance mail addressing
:for the particular machine.
:
:E.g. the line from /etc/passwd
:
:       duck:2QaBd4:321:20:Harold Wilberforce Clifton:/home/duck:/bin/sh
:
:would become the entries in /usr/lib/aliases for
:
:       clifton:        duck
:       harold: duck
:       harold.clifton: duck
:       harold.wilberforce.clifton:     duck
:       h.clifton:      duck
:       h.w.clifton:    duck
:       harold.w.clifton:       duck
:       etc.
:
:Thus instead of only being able to do '[email protected]', one can
:address this same person with the more comprehensible, and thus more
:memorizable, '[email protected]'.
:
:Where can I find the program that does this? I thought it might be in
:the Elm 2.4.22 distribution, in Smail 3.1.28, or in Perl 4.036, but it
:seems it is not. Then where _is_ it? Or could a person, knowledgeable
:in the field of probably Perl, do up such a script for me, please?

Well, that's a pretty easy script to write, but what are you going to
do about conflicts?  Lots of people have the same first name?

Here's a brute force method that pretty much works:

   #!/usr/bin/perl

   while (@pw = getpwent()) {
       ($login, $gcos) = @pw[0,6];
       $gcos =~ s/,.*//;               # phone information
       $gcos =~ s/&/\u\L$login/g;      # the dreaded & hack
       $gcos =~ s/\.//g;               # can't add too many dots

       @names = split(' ', $gcos);
       next unless @names > 0;

       &alias($names[0]);

       next unless @names > 1;

       &alias($names[$#names]);
       &alias(join ('.', $names[0], $names[$#names]));
       &alias(join ('.', substr($names[0],0,1), $names[$#names]));

       next unless @names > 2;

       &alias(join ('.', @names));

       &alias(join ('.', $names[0], substr($names[1],0,1), $names[$#names]))
           if length($names[1]) > 1;

       &alias(join ('.', substr($names[0],0,1), substr($names[1],0,1),
                           $names[$#names]))
           if length($names[1]) > 1 && length($names[2]) > 1;

   }

   sub alias {
       local($alias) = "\L$_[0]";
       return if $alias eq $login;

       if ($seen{$alias}) {
           warn "$alias already aliased to $seen{$alias}\n";
       } else {
           $seen{$alias} = $login;
       }

       print "$alias: $login\n";
   }