I'm in the middle of getting to grips with using the command line so I've written a list of handy commands, that I can refer back to. If it is useful to you too, please feel free to use it!
Basic commands
n.b directory is just another word for folder - I use them interchangeably
pwd
tells you which directory you are currently in (stands for 'print working directory'). By default, when you open the terminal, you will be in the home directory
ls
lists all the files and folders in the directory you are currently in. You can add 'switches' to get you slightly different results:
ls -a
lists all the files and folders in the current directory, including hidden ones
ls -l
lists all files and folders in the current directory in a long format, which shows you permissions, ownership, size and modification date
ls -t
lists all files and folders in the current directory, in order of the time they were last modified
ls -alt
combines all three commands (you can add as many or as few 'switches' as you need)
cd
change directory. Here are some more ways to use this command:
cd projects/example-project
in this example, this file path will take you from the current directory, down into the projects folder and down again into the example-project folder
cd ..
takes you up a folder level
cd ../..
takes you up two folder levels (you can add as many '/..' as you need to get up to the level you want)
cd ~
takes you back to your home directory from wherever you are
cd ~/projects
takes you back up to your home directory from wherever you are then down into a folder (in this case a folder called projects)
mkdir
creates a new folder (think of it as 'make directory')
touch
creates a new file
echo
prints a string e.g echo "Hello World"
will print Hello World on the Terminal screen
open
opens a file using the most appropriate programme on the computer e.g open hello.txt
will open the file using TextEdit (on a Mac)
cp
copies files or directories. The syntax is as follows:
cp folder-name-you-want-to-copy/filename-you-want-to-copy.txt folder-name-to-paste-to
mv
this has two main uses:
move files from one location to another. The syntax is as follows:
mv file1-to-be-moved.txt file2-to-be-moved.html destination-folder/destination-subfolder
rename files. The syntax is as follows:
mv old-filename.txt new-filename.txt
rm
deletes files and directories (think of it as 'remove' file or directory)
rm -r
deletes a directory and all of the directories and files within it CAUTION: This can't be reversed so use with care
rm -i
deletes files and directories but will ask you to confirm each deletion first (think of it as 'interactive')
rmdir
deletes an empty directory
cat
outputs the contents of a file (prints it on the Terminal screen)
less
previews the contents of a file, without leaving it permanently on your terminal screen (press q to stop viewing file)
head
outputs the first 10 lines of a file
tail
outputs the last 10 lines of a file
wc
gives you the word count (and the line and character count) of a file, in the order lines, words, characters. Use -l
-w
or -c
after wc
to see just that count.
Streams and redirection
Streams
Before looking at the rest of the commands, it is helpful to understand something called 'standard streams'. There are three of them: standard input (stdin), standard output (stdout) and standard error (stderr):
Standard input (stdin) is info inputted into the terminal using the keyboard, such as a command e.g.
cat index.html
Standard output (stdout) is the info outputted after that command e.g. the contents of the index.html file is printed to the screen in Terminal
Standard error (stderr) is an error message outputted when a process fails for whatever reason
Redirection
Using these streams, we can redirect inputs and outputs, into another command for example:
echo "Hello"
prints Hello on the screen. This is its output. We can take that output and redirect it to do something useful, like this:
echo "Hello" > hello.txt
This takes the output and puts it in a new file called hello.txt. If we were to open that file, we would see the text Hello at the top of it.
>
will redirect the standard output to wherever/whatever you put after the >
e.g. cat latest-sales-figures.txt > sales-figures.txt
will either create a new file called sales-figures.txt containing the info from latest-sales-figures.txt OR, if the files exists already, it will overwrite the contents of sales-figures.txt
>>
Does the same as >
, but it will append instead of overwriting the contents of the file
|
this is called the 'pipe'. It takes the output of the command on the left and 'pipes' or inputs it to the command on the right. e.g.
cat chapter1.txt | wc | cat > chapter1-word-count.txt
- in this example, the output of the first bit (the contents of the chapter1 file) is piped across as the input for wc, the output of which (the word count numbers) is then piped across to cat to be put into a new document called chapter1-word-count.txt. If you opened chapter1-word-count.txt, you would see it contains the 3 word count numbers as its content.
sort
- takes an input and orders it alphabetically
uniq
filters out adjacent, duplicate lines in a file. Because it only works on adjacent lines, it is useful to sort
first
grep
- a search tool. It searches files for lines that matches the pattern you specify and returns those lines. e.g grep "Jennifer" student-names.txt
will return all the lines containing Jennifer in the file. It is case-sensitive. Here are some ways of modifying grep
with switches:
grep -i
a case-insensitive version of the abovegrep -R
searches all files in a directory and returns filenames plus the lines in questiongrep -Rl
as above, but only returns filenames
sed
the 'Find & Replace' of Terminal. The syntax is as follows:
sed 's/text-to-find/text-to-replace-it-with/' filename.txt
s
stands for substitution and it is always used with sed
N.b this command will only replace the first instance in a line; to replace all instances in a line, use g at the end (it stands for global):
sed 's/text-to-find/text-to-replace-it-with/g' filename.txt
find
finds all files in the specified directories, including all its sub-directories (aka 'recursively'). It is a more powerful version of ls
. e.g
find ~/projects -name "*.png" > my-pngs.txt
will search my projects folder (and all its sub-folders) for png files and will create a new file called my-pngs.txt which will contain a list of those png files
man
built-in help pages. You can type man
before any command to open the help page for that command, which gives you an overview of how to use it e.g. man pwd
.
An even better version of man is tldr, which you have to install on your machine (the link takes you to the tldr pages GitHub repository - open the README file to get started).