Introduction
If you ever tried to work with Linux command line, ls command was surely one of the first commands you have executed. In fact, ls command is so frequently used, that its name is often considered as the best choice to name a Trojan Horse. Even though you use ls command on daily basis, its wast number of options always makes you to reach for ls’s manual page. Doing so you learn something new every time you open ls’s manual page . This guide will try to do the same. ls command belongs to a group of core utilities on your Linux system. GNU ls was written by Stallman and David MacKenzie based on the original AT&T code written in the 60s.
Let’s get started, no previous Linux skills are required. First, we will cover ls’s frequently used options and then we will introduce some more advanced features.
Frequently used options
- -l
This is very common option of ls command. By default ls displays only name of a file or directory. -l , alias long listing format, will instruct ls command to display more information for any given output. - -a, –all
Display also hidden files. In shell hidden files contain a “.” in front of its name. -a option will ensure that these files are not omitted from ls output. - -t
Sort output by modification date listing the oldest modification date as last - -r, –reverse
This options will simply reverse any ls’s output. - -h, –human-readable
With combination of -l option this fill print sizes in human readable format (e.g, 3K, 12M or 1G ).
Long listing format
This is very common and often use ls’s option. Not only this option displays additional information for a file or directory, this option is also required as a combination with some other ls options. The first thing we are going to do is to execute ls command without any options and arguments. You cannot go more basic with ls than that:
$ ls dir1 dir3 dir5 file2.txt file4.txt dir2 dir4 file1.txt file3.txt file5.txt
All what ls command did was to list all files and directories in our current working directory. Now with use of -l option we are able to see more information:
$ ls -l total 32 drwxr-xr-x 2 lubos lubos 4096 Jan 14 17:07 dir1 drwxr-xr-x 2 lubos lubos 4096 Jan 14 17:07 dir2 drwxr-xr-x 2 lubos lubos 4096 Jan 14 17:07 dir3 drwxr-xr-x 2 lubos lubos 4096 Jan 14 17:07 dir4 lrwxrwxrwx 1 lubos lubos 4 Jan 14 17:14 dir5 -> dir1 -rw-r--r-- 2 lubos lubos 2 Jan 14 17:15 file1.txt -rw-r--r-- 1 lubos lubos 2 Jan 14 17:15 file2.txt -rw-r--r-- 2 lubos lubos 2 Jan 14 17:15 file3.txt -rw-r--r-- 1 lubos lubos 2 Jan 14 17:15 file4.txt lrwxrwxrwx 1 lubos lubos 9 Jan 14 17:13 file5.txt -> file2.txt
From the output we can get a following information about file1.txt:
- permissions -> -rw-r–r–
- hard link count -> 2
- owner -> lubos
- group -> lubos
- size in bytes -> 2
- modification date -> Jan 14 17:15
- name -> file1.txt
Furthermore, additional information can be read from permission column. Note that our file1.txt permission starts with “-” which means that file1.txt is a regular file as oppose to file5.txt which is a symbolic link. Here are additional code meanings:
- – : Regular file. Can be text file, executable, image and etc.
- d : Directory.
- l : Symbolic link. When accessing this file Linux tries to access linked file
- p : Named Pipe.
- s : Socket
- b : Block Device
- c : Character device
Show hidden files
In Linux, all hidden files and directories start with “.” in their file name. By default ls ignores all entries starting with . thus not showing hidden files or directories. To display all hidden files and directories we can use -a option. For example:
$ ls $ touch file $ touch .file $ ls file $ ls -a . .. file .file
First we have created regular non-hidden file and with second command we created hidden .file. Only ls with -a option will display both files.
Sort output by modification date
By default, ls command sorts any output by file name in alphabetical order. -t option instructs ls command to display output sorted by modification time. For example:
$ ls -l total 0 -rw-r--r-- 1 lubos lubos 0 Sep 26 2000 0 -rw-r--r-- 1 lubos lubos 0 Jul 6 1978 A -rw-r--r-- 1 lubos lubos 0 Jan 1 2011 B -rw-r--r-- 1 lubos lubos 0 Jan 30 1942 C $ ls -lt total 0 -rw-r--r-- 1 lubos lubos 0 Jan 1 2011 B -rw-r--r-- 1 lubos lubos 0 Sep 26 2000 0 -rw-r--r-- 1 lubos lubos 0 Jul 6 1978 A -rw-r--r-- 1 lubos lubos 0 Jan 30 1942 C
As you can see ls command with -t option will sort output sorted by date with most recently modified files first.
Reverse output order
Previously, we have seen how to make ls command display all entries sorted by modification date. With -r option we can reverse this order to display last modified files as last.
$ ls -lt total 0 -rw-r--r-- 1 lubos lubos 0 Jan 1 2011 B -rw-r--r-- 1 lubos lubos 0 Sep 26 2000 0 -rw-r--r-- 1 lubos lubos 0 Jul 6 1978 A -rw-r--r-- 1 lubos lubos 0 Jan 30 1942 C $ ls -ltr total 0 -rw-r--r-- 1 lubos lubos 0 Jan 30 1942 C -rw-r--r-- 1 lubos lubos 0 Jul 6 1978 A -rw-r--r-- 1 lubos lubos 0 Sep 26 2000 0 -rw-r--r-- 1 lubos lubos 0 Jan 1 2011 B
This time we have listed files with the oldest modification date as first.
Human readable output
This option is relevant only to a file size and only with a combination of -l option. ls command displays file size in number of bytes by default. To get a more human readable output, -h option can be used, which translates bytes into KB, MB, GB and etc.
$ ls -l total 1813500 -rw-r--r-- 1 lubos lubos 19666 Feb 1 12:12 file1 -rw-r--r-- 1 lubos lubos 471957504 Feb 1 12:12 file2 -rw-r--r-- 1 lubos lubos 1257832448 Feb 1 12:12 file3 -rw-r--r-- 1 lubos lubos 127205376 Feb 1 12:12 file4 $ ls -lh total 1.8G -rw-r--r-- 1 lubos lubos 20K Feb 1 12:12 file1 -rw-r--r-- 1 lubos lubos 451M Feb 1 12:12 file2 -rw-r--r-- 1 lubos lubos 1.2G Feb 1 12:12 file3 -rw-r--r-- 1 lubos lubos 122M Feb 1 12:12 file4
Advanced options and features
Sort by file size
-S options will sort output by file size with smallest file last.
$ ls -S file3 file2 file4 file1 $ ls -Sl total 1813500 -rw-r--r-- 1 lubos lubos 1257832448 Feb 1 12:12 file3 -rw-r--r-- 1 lubos lubos 471957504 Feb 1 12:12 file2 -rw-r--r-- 1 lubos lubos 127205376 Feb 1 12:12 file4 -rw-r--r-- 1 lubos lubos 19666 Feb 1 12:12 file1
In this case the -l option is optional. We have used it just to display file size.
Combining multiple options
There is no harm in combining multiple ls options with a single ls command. In fact you are encouraged to do so. For example, we would like ls command not to display group ( -G ), show long listing format ( -l ) in human readable output ( -h ) and sort by size ( -S ) with smallest file first ( -r ).
$ ls -GlhSr total 572M prw-r--r-- 1 lubos 0 Feb 1 12:26 file5 lrwxrwxrwx 1 lubos 4 Feb 1 12:27 file3 -> file -rw-r--r-- 1 lubos 39 Feb 1 12:24 file drwxr-xr-x 2 lubos 4.0K Feb 1 12:25 dir1 -rw-r--r-- 1 lubos 20K Feb 1 12:12 file1 -rw-r--r-- 1 lubos 122M Feb 1 12:12 file4 -rw-r--r-- 1 lubos 451M Feb 1 12:12 file2
The above is a equivalent to:
ls -G -l -h -S -r Can you guess what this ls command does?:
$ ls -l -a -Shr
Using color terminal output
On some Linux systems ls command automatically prints output in a color to distinguish file type. This is caused by an alias “ls –color=auto”.
If you do not like the default color set you can change it by defining LS_COLORS environment variable. This is beyond the scope of this guide but just as an example we can change default directory color to white on blue background and file to red on green background with:
$ export LS_COLORS="di=97;104:fi=31;42"
List Subdirectories Recursively
By default ls command will list only directories and files in your current working directory. which means that if a directories in your current working directory contains other files or other directories they will not be listed. Here is an example:
$ mkdir -p dir1/dir2/dir3 $ touch dir1/dir2/file.txt $ tree . └── dir1 └── dir2 ├── dir3 └── file.txt 3 directories, 1 file $ ls dir1 $ ls -R .: dir1 ./dir1: dir2 ./dir1/dir2: dir3 file.txt ./dir1/dir2/dir3:
First we have created directories and file. Default ls command will then show only single directory dir1. With use of -R option ls command outputs all files and directories recursively.
ls command and wildcards
Wildcards is very broad topic. However, one must understand the basics in order to use ls and other Linux command efficiently. What follows is really just an introduction to wildcards.
Asterisk – *
Asterisk is a most common wildcard. It allows us to list only specific files where part of the filename can be replaces with “*” to mach any characters. For example, we want to list only files with txt extension:
$ ls file1.txt file2.txt file.sh file.txt pic1.png pic.jpg pic.png $ ls *.txt file1.txt file2.txt file.txt
Or we wish to list only files which start with “p”:
$ ls p* pic1.png pic.jpg pic.png
Or we can list only files with a letter “n” within its filename:
$ ls *n* pic1.png pic.png
Question mark – ?
? will represent any single character. For example:
$ ls file1.txt file2.txt file.sh file.txt pic1.png pic.jpg pic.png $ ls file?.txt file1.txt file2.txt
Or we can display file which extension consist only of 2 characters:
ls *.?? file.sh
Brackets – [ ]
Brackets are similar to ? as they can represent single character. However, in this case they can also represent one or more characters and we have a choice of which character to include in our wildcard. For example we can display all file names which contain number and start with p:
$ ls file1.txt file2.txt file.sh file.txt pic1.png pic.jpg pic.png $ ls f*[0-9]* file1.txt file2.txt
or extension ends with h or g:
$ ls *[h,g] file.sh pic1.png pic.jpg pic.png
Curly Brackets – { }
Curly brackets allow us to specify one or more terms, where term is a single character or wildcard. For example, we can list only files with txt and sh extension. Each term is separate by “,” ( comma ):
$ ls *{*.txt,*.sh} file1.txt file2.txt file.sh file.txt
To combine with [] we can list only files which has extension sh and txt but “.” ( dot )is preceded by any character but number.
$ ls file1.txt file2.txt file.sh file.txt pic1.png pic.jpg pic.png $ ls *[a-z]\.{*txt,*sh} file.sh file.txt
Exclamation mark – !
Exclamation mark acts as a negator. For example we want to list all files which do NOT end with “g” in their filename:
$ ls file1.txt file2.txt file.sh file.txt pic1.png pic.jpg pic.png $ ls *[!g] file1.txt file2.txt file.sh file.txt
Wildcards are powerful feature of Linux shell. For more information enter:
$ man 7 glob
List directories entries
This may sound intuitive but for some listing directory other than the current working directory is a mystery. With -d option ls will display directory itself rather than its content:
$ ls -l /var/ total 44 drwxr-xr-x 2 root root 4096 Jan 26 06:25 backups drwxr-xr-x 16 root root 4096 Jan 12 21:15 cache drwxr-xr-x 48 root root 4096 Jan 19 06:25 lib drwxrwsr-x 2 root staff 4096 Oct 3 13:52 local drwxrwxrwt 3 root root 4096 Feb 1 06:29 lock drwxr-xr-x 10 root root 4096 Feb 1 06:29 log $ ls -dl /var/ drwxr-xr-x 13 root root 4096 Jan 3 09:20 /var/
Display permissions of a current working directory:
$ ls -ld drwxr-xr-x 2 linuxcareer linuxcareer 4096 Feb 1 14:02 .
Using wildcard display permissions for all directories in /var/log/:
$ ls -ld /var/log/*/ drwxr-xr-x 2 root root 4096 Jan 3 09:23 /var/log/apt/ drwxr-xr-x 2 root root 4096 Jan 3 10:05 /var/log/ConsoleKit/ drwxr-xr-x 2 root root 4096 Jan 26 06:25 /var/log/cups/ drwxr-xr-x 2 root root 4096 Jan 3 09:21 /var/log/fsck/
Examples
Learning Linux ls command with examples | |
---|---|
Linux command syntax | Linux command description |
ls -1 |
Display output vertically. |
ls -ld dir |
Display long listing format of directory dir |
ls -li file |
Print inode number for a file |
ls -gG |
Display long listing format but do not show owner and group |
ls -m |
Print comma separated output |
ls -p |
Display slash after each directory |
ls -l | grep ^d |
Display only directories |
for i in $( ls *.jpg ); do convert -resize 1024x $i re_$i; done |
Re-size all images with extension JPG in a current working directory. Prefix new image with re_ |
ls -alct --full-time |
Display all hidden and non-hidden files and directories sorted by creation time with full time exact time |
ls -lact --time-style="+%Y" |
Display all hidden and non-hidden files and directories sorted by creation time. But display only year for each entry |