Clinfowiki

ls
Original author(s)coreutils: Richard Stallman and David MacKenzie
Developer(s)Various open-source and commercial developers
Written inC
Operating systemMultics, Unix, Unix-like, Plan 9, Inferno, MSX-DOS
TypeCommand
Licensecoreutils: GPLv3+
BusyBox: GPL-2.0-only
Toybox: 0BSD
Plan 9: MIT License

In computing, ls is a command to list computer files and directories in Unix and Unix-like operating systems. It is specified by POSIX and the Single UNIX Specification.

It is available in the EFI shell,[1] as a separate package for Microsoft Windows as part of the UnxUtils collection of native Win32 ports of common GNU Unix-like utilities,[2] or as part of ASCII's MSX-DOS2 Tools for MSX-DOS version 2.[3]

The numerical computing environments MATLAB and GNU Octave include an ls function with similar functionality.[4][5]

In other environments, such as DOS, OS/2, and Microsoft Windows, similar functionality is provided by the dir command.

History

An ls utility appeared in the first version of AT&T UNIX, the name inherited from a similar command in Multics also named 'ls', short for the word "list".[6][7][8] ls is part of the X/Open Portability Guide since issue 2 of 1987. It was inherited into the first version of POSIX.1 and the Single Unix Specification.[9]

Behavior

Unix and Unix-like operating systems maintain the idea of a working directory. When invoked without arguments, ls lists the files in the working directory. If a directory is specified as an argument, the files in that directory are listed; if a file is specified, that file is listed. Multiple directories and files may be specified.

In many Unix-like systems, names starting with a dot (.) are hidden. Examples are ., which refers to the working directory, and .., which refers to its parent directory. Hidden names are not shown by default. With -a, all names, including all hidden names, are shown. Using -A shows all names, including hidden names, except for . and ... File names specified explicitly (for example ls .secret) are always listed.

Without options, ls displays names only. The different implementations have different options, but common options include:

Additional options controlling how items are displayed include:

  • -R Recursively list items in subdirectories.
  • -t Sort the list by modification time (default sort is alphabetically).
  • -u Sort the list by last access time.
  • -c Sort the list by last attribute (status) change time.
  • -r Reverse the order, for example most recent time last.
  • --full-time Show times down to the second and millisecond instead of just the minute.
  • -1 One entry per line.
  • -m Stream format; list items across the page, separated by commas.
  • -g Include group but not owner.
  • -o Include owner but not group (when combined with -g both group and owner are suppressed).
  • -d Show information about a directory or symbolic link, rather than the contents of a directory or the link's target.
  • -F Append a "/" to directory names and a "*" to executable files.

It may be possible to highlight different types of items with different colors. This is an area where implementations differ:

  • GNU ls uses the --color option;[13] it checks the Unix file type, the file permissions and the file extension and uses its own database to control colors maintained using dircolors.
  • FreeBSD ls uses the -G option; it checks only the Unix file type and file permissions and uses the termcap database[14]

When the option to use color to indicate item types is selected, the output might look like:

-rw-r--r--    1 tsmitt nregion   26650 Dec 20 11:16 audio.ogg
brw-r--r--    1 tsmitt nregion      64 Jan 27 05:52 bd-block-device
crw-r--r--    1 tsmitt nregion     255 Jan 26 13:57 cd-character-device
-rw-r--r--    1 tsmitt nregion     290 Jan 26 14:08 image.png
drwxrwxr-x    2 tsmitt nregion      48 Jan 26 11:28 di-directory
-rwxrwxr-x    1 tsmitt nregion      29 Jan 26 14:03 ex-executable
-rw-r--r--    1 tsmitt nregion       0 Dec 20 09:39 fi-regular-file
lrwxrwxrwx    1 tsmitt nregion       3 Jan 26 11:44 ln-soft-link -> dir
lrwxrwxrwx    1 tsmitt nregion      15 Dec 20 10:57 or-orphan-link -> mi-missing-link
drwxr-xrwx    2 tsmitt nregion    4096 Dec 20 10:58 ow-other-writeable-dir
prw-r--r--    1 tsmitt nregion       0 Jan 26 11:50 pi-pipe
-rwxr-sr-x    1 tsmitt nregion       0 Dec 20 11:05 sg-setgid
srw-rw-rw-    1 tsmitt nregion       0 Jan 26 12:00 so-socket
drwxr-xr-t    2 tsmitt nregion    4096 Dec 20 10:58 st-sticky-dir
-rwsr-xr-x    1 tsmitt nregion       0 Dec 20 11:09 su-setuid
-rw-r--r--    1 tsmitt nregion   10240 Dec 20 11:12 compressed.gz
drwxrwxrwt    2 tsmitt nregion    4096 Dec 20 11:10 tw-sticky-other-writeable-dir

Sample usage

The following example demonstrates the output of the command:

$ ls -l
drwxr--r--   1 fjones editors     4096 Mar  2 12:52  drafts
-rw-r--r--   3 fjones editors    30405 Mar  2 12:52  edition-32
-r-xr-xr-x   1 fjones bookkeepers 8460 Jan 16  2022  edit.sh

Each line shows the d (directory) or - (file) indicator, Unix file permission notation, number of hard links (1 or 3), the file's owner, the file's group, the file size, the modification date/time, and the file name. In the working directory, the owner fjones has a directory named drafts, a regular file named edition-32, and an executable named edit.sh which is "old", i.e. modified more than 6 months ago as indicated by the display of the year.

┌─────────── file (not a directory)
|┌─────────── read-write (no execution) permissions for the owner
|│  ┌───────── read-only permissions for the group
|│  │  ┌─────── read-only permissions for others
|│  │  │     ┌── number of hard links
|│  │  │     │   ┌── owner
|│  │  │     │   │     ┌── user group
|│  │  │     │   │     │          ┌── file size in bytes
|│  │  │     │   │     │          │    ┌── last modified on
|│  │  │     │   │     │          │    │                ┌── filename
-rw-r--r--   3 fjones editors    30405 Mar  2 12:52  edition-32

See also

References