Filing beats tagging and searching

I confess I don’t get the enthusiasm for programs like Evernote and Yojimbo. Giving my documents descriptive names and putting them in descriptively named folders seems far better to me than trying to develop and stick with a consistent taxonomy for all my stuff.

I suppose my preference for using the hierarchical file system comes from the way I’ve had to organize my computer files at work, where every project must be kept separate from the others. Here’s my standard hierarchy:

Folder hierarchy for project work

Within my home folder is a folder named projects. Within projects is a folder for each project. Within each project folder are folders for correspondence, photographs, reports, drawings, design standards, product manuals, etc. Within the Photos folder are folders for every day I took project photographs.

I guess Apple would prefer me to put all my projects folders in Documents, but I’ve always thought the Documents folder is a waste of a directory level—just about every file I create is a document.

This arrangement works for me because everything I need to work on a particular project is in that project’s folder. Where are the photos I took? In the Photos folder. Where’s my report? In the report folder. And if I need something—an ASTM standard, say—for more than one project, I copy it into both folders. Disk space is cheap.

This organization of digital files is mimicked in the organization of paper files. A portion of a file drawer is set aside for the project; within that section are folders for paper correspondence, printed photographs, handwritten notes, and so on. By keeping things consistent from project to project, I reduce the amount of thinking I have to do about purely clerical matters, and I make it easy to find what I need when I need it.

Since the digital and paper organization is about the same from project to project, I’m able to script the creation of all the necessary directories and folder labels. When I open a new project, I get a project name and number from my companies central database. I then run a script on my computer called newproject, which

  1. Prompts me for all the required information.
  2. Creates the directory hierarchy under the ~/projects directory.
  3. Adds an entry to my project list file (discussed in this post from a couple of years ago).
  4. Prints out the necessary file folder labels for organizing the paperwork.

I’ve used newproject for ten years or more, which is why it’s written in Perl. Here’s the source code:

 1:  #!/usr/bin/perl
 3:  # collect required info from user
 4:  print "\n";
 5:  print "\033[1mProject name:         \033[22m";  # the escape codes
 6:  chomp($name = <>);
 7:  print "\033[1mProject number:       \033[22m";  # in these lines
 8:  chomp($number = <>);
 9:  print "\033[1mClient name:          \033[22m";  # turn bold text on
10:  chomp($client = <>);
11:  print "\033[1mClient reference:     \033[22m";  # for the prompts and
12:  chomp($ref = <>);
13:  print "\033[1mSubdirectory:         \033[22m";  # off for the responses
14:  chomp($dir = <>);
15:  print "\033[1mPhotos?[y/n]:         \033[22m";
16:  chomp($photos = <>);
17:  print "\033[1mSmall project?[y/n]:  \033[22m";
18:  chomp($small = <>);
19:  print "\033[1mLabel position [r,c]: \033[22m";
20:  chomp($rc = <>);
21:  print "\n";
23:  # append info to project list file
24:  open PL, ">> $ENV{'HOME'}/Dropbox/pl" or die "Couldn't open project list";
25:  select PL;
26:  print "$name|$number|$client|$ref|$dir|\n";
28:  # make directory for project files
29:  # return error message if problem
30:  print `mkdir $ENV{'HOME'}/projects/$dir`;
32:  # make correspondence directory
33:  # return error message if problem
34:  print `mkdir $ENV{'HOME'}/projects/$dir/corr`;
36:  # make directory for project photos if wanted
37:  # return error message if problem
38:  if ($photos =~ /^y/i) {
39:    print `mkdir $ENV{'HOME'}/projects/$dir/Photos`;
40:  }
42:  # make file folder labels and send to the printer
43:  ($row,$col) = split(/,/, $rc);
44:  $labeldata = "#$name|$number\n  \n\n";
45:  unless ($row==0 or $col==0) {
46:    if ($small =~ /^y/i) {
47:      $labeldata .= "Notes, photographs, report\n";
48:    } else {
49:      $labeldata .= "\Correspondence\n\nNotes\n";
50:      $labeldata .= "\nPhotographs\n" if $photos =~ /^y/i;
51:      $labeldata .= "\n#\\0\\0\\0$name|$number\\0\\0\\0\n";   # narrower for the tab insert
52:    }
54:    open LABELPRINT, "|pflabels -r$row -c$col";
55:    print LABELPRINT $labeldata;
56:    # print $labeldata;
57:  }

Lines 4-21 include terminal escape codes to get the prompts to print in bold. Extra spaces are printed out after each prompt so my responses all line up.

New project interactive session

Lines 23-26 add the entry to the project list file, a simple database I use to keep track of all my projects, past and present.

Lines 28-40 create the directories. The Photos directory is created only if I answered yes to that question.

Lines 42-57 generate the labels for the physical file folders. If I know at the outset that a project will be small and short-lived, all the paperwork can go in a single folder. The label data follows the format required for my pflabels script, and the data is piped to that script in Lines 54-55. The necessary labels are then printed on Avery 5161 1″×4″ labels.

Line 51 uses special troff codes to make one label narrow enough to fit on a 3½ inch tab insert. I stick the label on the cardboard insert, cut off the overhang, and use the tab insert in a hanging folder to separate projects in my file drawers. It takes longer to describe than to do.