When learning to code it’s easy to get lost in the tools you need to get started building real projects. Terminal (command line) is one those indispensable tools that can take you years to learn without proper guidance.
In this beginner tutorial you’ll learn the most common, cool, and useful console commands that you can run in almost any UNIX-like environment, including Linux and macOS.
pwd
- print working directory
pwd
allows you to output the current directory you’re in. It provides a short and easy answer to the question “Where am I?”. It’s very useful to run the pwd
command at the beginning of your terminal session. Here’s an example of running pwd
right after logging into the server as a root.
root@scw-tender-lewin:~# pwd
/root
ls
- list files and directories
To view the content of the directory, you can use the ls
(list) command. The basic usage goes like this:
root@scw-tender-lewin:/# ls
bin dev home initrd.img.old lib64 media opt root sbin srv sys usr vmlinuz
boot etc initrd.img lib lost+found mnt proc run snap swapfile tmp var vmlinuz.old
If you want to check out the content of a specific directory, i.e. var
, you can do it by adding its path right after the ls
:
root@scw-tender-lewin:/# ls /var
backups cache crash lib local lock log mail opt run snap spool tmp
There are also a couple of useful flags that will change the format of the output of the ls
command.
Long list view
The -l
flag will do the long list view, which shows additional information like permissions, owner, size, date, etc.:
root@scw-tender-lewin:/# ls -l
total 4194396
drwxr-xr-x 2 root root 4096 May 15 06:46 bin
drwxr-xr-x 4 root root 4096 Sep 3 06:15 boot
drwxr-xr-x 16 root root 3680 May 20 06:35 dev
drwxrwxr-x 93 root root 4096 Sep 3 06:15 etc
drwxr-xr-x 3 root root 4096 Mar 6 09:14 home
lrwxrwxrwx 1 root root 34 Sep 3 06:15 initrd.img -> boot/initrd.img-4.15.0-115-generic
lrwxrwxrwx 1 root root 34 Sep 3 06:15 initrd.img.old -> boot/initrd.img-4.15.0-112-generic
drwxr-xr-x 23 root root 4096 Mar 6 09:16 lib
drwxr-xr-x 2 root root 4096 Jul 8 06:20 lib64
drwx------ 2 root root 16384 Mar 5 2019 lost+found
drwxr-xr-x 2 root root 4096 Feb 4 2019 media
drwxr-xr-x 2 root root 4096 Feb 4 2019 mnt
drwxr-xr-x 3 root root 4096 Mar 6 09:17 opt
dr-xr-xr-x 189 root root 0 May 4 06:16 proc
drwx------ 8 root root 4096 Mar 19 08:13 root
drwxr-xr-x 28 root root 1120 Sep 3 07:21 run
drwxr-xr-x 2 root root 12288 Jul 8 06:20 sbin
drwxr-xr-x 2 root root 4096 Mar 6 09:14 snap
drwxr-xr-x 2 root root 4096 Feb 4 2019 srv
-rw------- 1 root root 4294967296 Mar 6 10:10 swapfile
dr-xr-xr-x 13 root root 0 May 4 06:16 sys
drwxrwxrwt 10 root root 4096 Sep 3 07:22 tmp
drwxrwxr-x 10 root root 4096 Mar 5 2019 usr
drwxr-xr-x 13 root root 4096 Mar 5 2019 var
lrwxrwxrwx 1 root root 31 Sep 3 06:15 vmlinuz -> boot/vmlinuz-4.15.0-115-generic
lrwxrwxrwx 1 root root 31 Sep 3 06:15 vmlinuz.old -> boot/vmlinuz-4.15.0-112-generic
By the way, if you want to check some specific information about a single file, you can add its name the same way we did with the directory. Here’s how you could check the long list view on the swapfile
:
root@scw-tender-lewin:/# ls -l swapfile
-rw------- 1 root root 4294967296 Mar 6 10:10 swapfile
Hidden files and folders
To view the hidden files and folders you should add the -a
flag to the ls
command:
root@scw-tender-lewin:/# ls -a
. bin dev home initrd.img.old lib64 media opt root sbin srv sys usr vmlinuz
.. boot etc initrd.img lib lost+found mnt proc run snap swapfile tmp var vmlinuz.old
This way, we always get at least two additional records: .
and ..
. A single dot stands for the current directory, and the double dot is used to access the directory one level above the current.
Sorting the output of the ls
command
The -S
flag is used to sort the results by size in descending order.
root@scw-tender-lewin:/# ls -S
swapfile sbin boot home lib64 mnt root srv usr dev initrd.img vmlinuz proc
lost+found bin etc lib media opt snap tmp var run initrd.img.old vmlinuz.old sys
Combining the flags
Quite often you want to achieve a complex behavior. For example, you might want to get both the long list view with -l
, the human-readable size output with -h
and sort the results with the -S
flag.
To achieve this, you can just combine all flags into one. The order of the flags doesn’t matter here and -lhS
is equivalent to -hSl
, so you can use any sequence you like:
root@scw-tender-lewin:/# ls -lhS
total 4.1G
-rw------- 1 root root 4.0G Mar 6 10:10 swapfile
drwx------ 2 root root 16K Mar 5 2019 lost+found
drwxr-xr-x 2 root root 12K Jul 8 06:20 sbin
drwxr-xr-x 23 root root 4.0K Sep 3 06:15 .
drwxr-xr-x 23 root root 4.0K Sep 3 06:15 ..
drwxr-xr-x 2 root root 4.0K May 15 06:46 bin
drwxr-xr-x 4 root root 4.0K Sep 3 06:15 boot
drwxrwxr-x 93 root root 4.0K Sep 3 06:15 etc
drwxr-xr-x 3 root root 4.0K Mar 6 09:14 home
drwxr-xr-x 23 root root 4.0K Mar 6 09:16 lib
drwxr-xr-x 2 root root 4.0K Jul 8 06:20 lib64
drwxr-xr-x 2 root root 4.0K Feb 4 2019 media
drwxr-xr-x 2 root root 4.0K Feb 4 2019 mnt
drwxr-xr-x 3 root root 4.0K Mar 6 09:17 opt
drwx------ 8 root root 4.0K Mar 19 08:13 root
drwxr-xr-x 2 root root 4.0K Mar 6 09:14 snap
drwxr-xr-x 2 root root 4.0K Feb 4 2019 srv
drwxrwxrwt 10 root root 4.0K Sep 3 07:22 tmp
drwxrwxr-x 10 root root 4.0K Mar 5 2019 usr
drwxr-xr-x 13 root root 4.0K Mar 5 2019 var
drwxr-xr-x 16 root root 3.6K May 20 06:35 dev
drwxr-xr-x 28 root root 1.1K Sep 3 07:21 run
lrwxrwxrwx 1 root root 34 Sep 3 06:15 initrd.img -> boot/initrd.img-4.15.0-115-generic
lrwxrwxrwx 1 root root 34 Sep 3 06:15 initrd.img.old -> boot/initrd.img-4.15.0-112-generic
lrwxrwxrwx 1 root root 31 Sep 3 06:15 vmlinuz -> boot/vmlinuz-4.15.0-115-generic
lrwxrwxrwx 1 root root 31 Sep 3 06:15 vmlinuz.old -> boot/vmlinuz-4.15.0-112-generic
dr-xr-xr-x 191 root root 0 May 4 06:16 proc
dr-xr-xr-x 13 root root 0 Sep 3 08:25 sys
cd
- change directory
So, after you’ve learned everything about the content in the directory, you probably want to go somewhere else. The cd
command will take a directory name as a single argument and move you there. The cd
command only prints the output if there’s an error, so you might want to immediately use the ls
command to look around:
root@scw-tender-lewin:/# cd var
root@scw-tender-lewin:/var# ls -a
. .. backups cache crash lib local lock log mail opt run snap spool tmp
Moving into the parent folder
To move one folder above you should use the ..
as a directory name. To move two or more levels above you can type cd ../..
and so on.
If you’ve tried to navigate to the directory that doesn’t exist, you’ll see the following message:
root@scw-tender-lewin:/var# cd local42
-bash: cd: local42: No such file or directory
root@scw-tender-lewin:/var# cd ..
root@scw-tender-lewin:/# ls
bin dev home initrd.img.old lib64 media opt root sbin srv sys usr vmlinuz
boot etc initrd.img lib lost+found mnt proc run snap swapfile tmp var vmlinuz.old
Going home
If you use the ~
symbol as a directory name, you’ll be moved into your home folder. It’s a useful shortcut as it doesn’t matter where you are at the moment, and you might now know the exact path to the home directory at some point.
root@scw-tender-lewin:/# cd ~
root@scw-tender-lewin:~# pwd
/root
touch
- create a file
The touch
command allows you to create an empty file. So, here’s the plan:
- Navigate to our home directory with
cd ~
- Make sure it’s empty with
ls
- Create a new file using
touch
and providing a filename right after it - Run the
ls
command once again to see that the newly created file exists
root@scw-tender-lewin:/var/log# cd ~
root@scw-tender-lewin:~# ls
root@scw-tender-lewin:~# touch hello.txt
root@scw-tender-lewin:~# ls
hello.txt
mkdir
- create a directory
To create a directory in Linux you should use the mkdir
command. It works almost the same way as touch
and expects the directory name.
root@scw-tender-lewin:~# mkdir internal
root@scw-tender-lewin:~# ls
hello.txt internal
man
- display a manual / get help
And finally, the superpower! The man
command will give you a short manual on any command, even itself. If you want to do something but have forgotten an important flag or the command syntax, just type man
followed by the command name to get an instant manual. Here’s an example:
root@scw-tender-lewin:~# man ls
NAME
ls -- list directory contents
SYNOPSIS
ls [-ABCFGHLOPRSTUW@abcdefghiklmnopqrstuwx1%] [file ...]
DESCRIPTION
For each operand that names a file of a type other than directory, ls displays its name as well as any requested, associated information.
For each operand that names a file of type directory, ls displays the names of files contained within that directory, as well as any
requested, associated information.
If no operands are given, the contents of the current directory are displayed. If more than one operand is given, non-directory operands
are displayed first; directory and non-directory operands are sorted separately and in lexicographical order.
The following options are available:
...
Conclusion
In this article, we’ve reviewed the easiest to use and straightforward Linux, macOS, and *nix system commands like ls
, pwd
, cd
, touch
, mkdir
, and man
.
If you’re just starting your journey into the software development world, you might be intimidated by the looks of the all-mighty terminal or command-line.
But as you see, it’s quite easy and straightforward if you start at the right spot.