Wes Ellis./ a personal notebook
Technology. Stories. Side projects.
A few things worth writing down.
← Back to Retro Tech

Retro Tech

Organizing Vintage Mac Software: How I Name and File a Classic Mac Archive

Part 4 of the thread The retro workbench

THE SHORT VERSION4 points
  • One level of category folders, no deeper. Three levels down, you'll never find anything again.
  • Underscores for spaces, periods in version numbers (6.0, not 6_0), and leave the extension alone.
  • Keep classic software in its archive or image format on a PC, or the resource fork goes missing.
  • A PowerShell script renames from a CSV map and logs the original names. Run it with -WhatIf first.

If you collect classic Mac software, you know how it goes. You grab a few things from Macintosh Garden, a CD image from somewhere else, a disk someone uploaded in 2006, and one day you've got a folder with 400 files called things like SaveHollywood17.zip, Stuffit Deluxe 6_0.sit and Mac OS X 10.4 Tiger Retail DVD.iso. Finding anything becomes an archaeology project of its own.

Here's the system I settled on. It isn't the only sensible one, but it's held up as the collection has grown.

The folders

I keep it flat: one level of category folders, and that's it.

  • System Software
  • Internet
  • Web Browsers
  • Utilities
  • Creative
  • Games
  • Screensavers

Yes, web browsers could live under Internet. I split them out because I go looking for old browsers more than anything else, and the Internet folder was getting crowded with FTP clients and email apps.

Tip

Resist the urge to nest deeper. Three levels down, you'll never find anything again.

The naming rules

  1. Underscores instead of spaces. Old Mac file names can be up to 31 characters and allow almost anything, but that doesn't survive a trip through Windows, zip tools, and web servers nearly as well.
  2. Drop the troublesome characters. Colons were the path separator on classic Mac OS, and slashes, question marks and the like cause problems on Windows. Curly quotes and ™ symbols go too.
  3. Periods in version numbers. 6.0, not 6_0. 1.7, not 17. Keep beta and alpha markers as they are: 5.5b1.
  4. Architecture when it matters. 68k, PPC or FAT for apps that shipped in more than one flavor.
  5. Leave the extension alone. It tells you how to open the thing.

Some before-and-afters:

Stuffit Deluxe 6_0.sit             ->  StuffIt_Deluxe_6.0.sit
Mac OS X 10.4 Tiger Retail DVD.iso ->  MacOSX_Tiger_10.4_Retail.iso
SaveHollywood17.zip                ->  SaveHollywood_1.7.zip
Internet Explorer 5_5b1.sit        ->  Internet_Explorer_5.5b1.sit

For multi-disc software I use Disc1, Disc2 and so on, consistently, and I only keep a region marker when I actually have more than one regional version.

What the extensions mean

You'll run into these a lot:

Extension What it is
.sit / .sea StuffIt archives, and self-extracting StuffIt archives. The workhorses of the System 7 through OS 9 era.
.hqx BinHex. A text encoding that keeps the resource fork intact across the internet. Usually wraps a .sit.
.bin MacBinary, which also preserves both forks. (Not the same as a .bin CD image, which is a different thing entirely.)
.img / .image Disk Copy images, common for floppy and system disks.
.dmg Disk images from the Mac OS X era.
.toast Roxio Toast CD images.
.cdr A raw CD/DVD master, basically an ISO by another name.

Heads up

That resource fork business matters. Classic Mac apps store a lot of themselves in the resource fork, which most non-Mac file systems throw away. Keep things in their archive or image format while they sit on a PC or NAS, and only expand them on a real Mac or an emulator. (Getting them onto the Mac is its own adventure; here's how I make HFS+ USB drives on Windows.)

The rename script

Renaming 400 files by hand is how mistakes happen, so I build a CSV map, one row per file, and let a script do it. Two columns, OldName and NewName.

The script renames each file, skips anything that's missing or would overwrite something, and appends every result to a log. That log doubles as the record of original file names, which I like to keep for preservation reasons.

<#
.SYNOPSIS
    Renames files in an archive folder from a CSV map and logs the original names.
.EXAMPLE
    .\Rename-ArchiveFile.ps1 -Folder D:\MacArchive\Utilities -MapCsv .\utilities-map.csv -WhatIf
#>
[CmdletBinding(SupportsShouldProcess)]
param(
    [Parameter(Mandatory)]
    [ValidateScript({ Test-Path $_ -PathType Container })]
    [string]$Folder,

    [Parameter(Mandatory)]
    [ValidateScript({ Test-Path $_ -PathType Leaf })]
    [string]$MapCsv,

    [string]$LogCsv = (Join-Path $Folder 'rename-log.csv')
)

# The CSV has two columns: OldName,NewName
$map = Import-Csv -Path $MapCsv
$log = foreach ($row in $map) {
    $source = Join-Path $Folder $row.OldName
    $target = Join-Path $Folder $row.NewName
    $status = 'Renamed'

    if (-not (Test-Path -LiteralPath $source)) {
        $status = 'Missing'
    }
    elseif ($row.OldName -ne $row.NewName -and (Test-Path -LiteralPath $target)) {
        $status = 'TargetExists'
    }
    elseif ($PSCmdlet.ShouldProcess($row.OldName, "Rename to $($row.NewName)")) {
        try {
            Rename-Item -LiteralPath $source -NewName $row.NewName -ErrorAction Stop
        }
        catch {
            $status = "Failed: $($_.Exception.Message)"
        }
    }
    else {
        $status = 'WhatIf'
    }

    [pscustomobject]@{
        OldName = $row.OldName
        NewName = $row.NewName
        Status  = $status
        When    = Get-Date -Format s
    }
}

if (-not $WhatIfPreference) {
    $log | Export-Csv -Path $LogCsv -NoTypeInformation -Append
}
$log

Always run it with -WhatIf first:

.\Rename-ArchiveFile.ps1 -Folder D:\MacArchive\Utilities -MapCsv .\utilities-map.csv -WhatIf

It prints what it would do without touching anything (and yes, -WhatIf has its own traps worth knowing about). When the list looks right, drop -WhatIf and run it for real.

Keeping it tidy

  • Write the rules down. A README at the top of the archive with your naming rules saves you from arguing with yourself a year from now.
  • Keep the logs. If a file name turns out to matter (some installers check for their own name), you'll want the original.
  • Back it up twice. Some of this stuff is hard to find again, and a few titles aren't anywhere else anymore.
  • Spot-check after renaming. Open a handful of archives in an emulator or on real hardware to make sure nothing got mangled.

Where to find more