A Brief History of the 'ls' command LG #48

indexnew-2026870 homenew-6102920 back2-6980848 fwd-9065824

The ls command, which lists files, is one of the most essential utilities for Unix and Linux users and, not surprisingly, one of the oldest. In its earliest form it was called listf and was available on the Massachusetts Institute of Technology’s Compatible Time Sharing System (CTSS) by July, 1961. By 1963, there were a few options that could be used to vary what listf would list:

listf list files, newest first
listf rev list files, oldest first
listf file extension give information about the named file
listf month day year list files older than the given date

In 1965, listf was extended to recognize « * » as a way to list all files that matched a specific pattern, with further improvements to the pattern matching in an updated version dated January 3, 1966. The 1966 version also generalized the syntax and added lots of options, including:

listf (file) list only files, not links
listf (auth) user list files created by the given user
listf (made) mmddyy [mmddyy] list files created between the given dates
listf (srec) list by size
listf (smad) list by date of last modification
listf (rev) list in reverse order
listf (long) list in long format

When CTSS was superseded by Multics, the listf command was renamed to list, which could optionally be abbreviated to ls. The early version of ls had fewer options than late versions of listf had, but still included, along with a few others:

list -all (ls -a) list everything
list -date_time_modified (ls -dtm) list by date of last modification
list -reverse (ls -rv) list in reverse order

When Bell Labs dropped out of Multics development in 1969 and work began on Unix, only the abbreviated name of list, ls, was retained. The First Edition (November 3, 1971) Unix manual documented the following options for ls, all of which are still available today:

ls -l   list in long format
ls -t sort by time modified
ls -a list everything, including names starting with `.’
ls -s include the size of files in the listing
ls -d list directories’ names, not their contents

By the Fifth Edition (manual page dated March 20, 1974) the list of options for ls had expanded to include:

ls -r   list in reverse order
ls -u use access time, not modification time
ls -i list i-number for each file
ls -f don’t sort the listing at all
READ  Linux Gazette MailBag LG #39

The Sixth Edition (May, 1975) added one more:

ls -g   list group IDs in the long format listing

In May and August, 1977, Bill Joy made some modifications of his own to ls at the University of California, Berkeley, which he subsequently distributed as part of the First Berkeley Software Distribution, 1BSD. The most dramatic difference with this version of ls was that it listed files in multiple columns rather than only listing one name per line. The options to control this new format were:

ls -1   list one name per line (no columns)
ls -c list in columns
ls -x list in columns, but sort across, not down
ls -q show control characters as `?’
ls -m everything on one line, separated by commas

There was some controversy over whether it was appropriate to include code to print in columns as an integral part of ls or whether instead the formatting into columns should be done by a separate program into which the output of ls (or any other program) could be piped.

At the beginning of 1979, Bell Labs released Seventh Edition Unix. Its version of ls did not incorporate the controversial changes, and had one new option that conflicted with a letter that Joy had also used:

ls -c   use inode change time, not modification time

A new Berkeley version of ls, dated August 26, 1980 and released with 4.0BSD, resolved the conflict by capitalizing the option to list in columns: ls -C. It also added to what the manual was by this time calling « an unbelievable number of options: »

ls -F   mark directories with `/’, programs with `*’
ls -R recursively list subdirectories
ls -b show control characters as their ASCII codes

Another revision in 4.2BSD (July 28, 1983) removed the -m, -b, and -x options — but not before System V Release 2 had added all three of these to its own repertoire of options. They temporarily stayed alive there, but none of the three survived POSIX standardization so the 4.2BSD version of ls is essentially ls as we know it today.

Copyright © 1999, Eric Fischer
Published in Issue 48 of Linux Gazette, December 1999

indexnew-2026870 homenew-6102920 back2-6980848 fwd-9065824