>> [MUSIC PLAYING]
>> DOUG LLOYD: OK.
So let's talk about how to
use the Linux command line.
Now, the CS50 IDE, or in
fact, even a CS50 appliance,
if you're familiar with that, or
you're taking an older version of CS50,
is a cloud-based machine
which runs Ubuntu,
which is one of the many flavors
of the Linux operating system.
Linux operating system is
favored by programmers,
because it's just cooler, right?
>> Many modern Linux distributions
have graphical user interfaces,
which we also call GUIs, G-U-I, to
allow easy mouse-based navigation,
which you're probably familiar with,
if you're a Windows or Mac user,
moving around your mouse,
double-clicking on icons, and so on.
Still though, as a programmer,
and even though the IDE
contains the ability to
do some graphical user
stuff, clicking, and
dragging, and all that,
you'll still be using your
terminal window pretty frequently.
And you can do many of the
same tasks that you can
do with a mouse with keyboard commands.
And we're going to talk a little bit
about what some of those commands
are right now.
>> Now, these commands can be used
on any Unix-based operating
system, which includes Linux,
but also includes Mac OS.
If you open up Terminal on your Mac,
you can use these exact commands.
Windows also has Command
Prompt, but some of the commands
are slightly different, so
it doesn't actually work,
because Windows is not
a Unix-based system.
>> So let's take a look at some
of these Linux commands.
The first one that you'll
probably use quite a lot is ls.
That's a lowercase l, followed by a
lowercase s, which is short for list.
And what the list command does is it
gives you a readout of all the files
and folders in your current directory.
So you can see everything you can
get to from where you currently are.
>> So I've opened up here the CS50 IDE.
And I'm going to zoom-in in a
second to give you a closer look,
but here's the broad picture
of what the IDE looks like.
On the left, you can see we have
a file tree, which you're probably
familiar with, double-clicking, and
files and folders, and all that stuff.
So that's still there
in the CS50 appliance.
At the center in the top is where you're
going to be writing your code, once
you click on a file.
And at the bottom, we
have a terminal window,
which is where we can execute
these terminal commands.
>> I'm going to zoom-in
and head over here, just
to show you that, in fact, I can
click on these files and folders.
So clearly, where I currently am, I have
two folders, called pset0 and pset1,
and three files, one called
hello, one called hello.c,
and one called hello.txt.
>> So let's move down to the terminal
window and get a closer look.
So we just talked, again, about the
fact that we have three files and two
folders in the current directory.
If I type ls, which again
is the command to list
the contents of the current
directory, and then I hit Enter,
look what I see, hello, hello.c,
hello.txt, pset0 and pset1.
>> pset0 and pset1 are
colored blue, to indicate
to you that those are directories
that we could navigate into.
And we'll learn a little
bit about how to navigate
into directories in a minute.
And every other thing is colored black,
if it's a text file or a source code
file, and green, if
it's an executable file.
So clearly, that means that I
could run a program called, hello.
That's what the green one there means.
But basically, typing the
ls command has allowed
me to look at everything that exists
in my current directory, which
matches what we see here, in the
graphical display of the same.
The next command you'll
probably use quite a bit
is cd, lowercase c, lowercase d,
which is short for change directory.
This allows us to do what I was
talking about a second ago, which
is to navigate between
directories at the command
line, as opposed to
double-clicking on folders.
So if we type cd and then
the name of a directory,
we can get into that directory.
>> As an aside, know that the name
of the current directory is always
dot, and the name of the directory
one level above where we are now,
that is the name of the folder in
which our folder is, dot, dot--
or in which our folder is, is dot, dot.
And if you're ever curious about
the name of your directory,
you can type pwd, which stands
for present working directory.
We'll take a look at all of these
now, by heading back to the CS50 IDE.
So I'm back in my workspace now.
And I'll zoom-in again on the
terminal, so we can take a look
at moving around within the IDE.
So I'm going to list the
contents of my directory
again, just to reground
us in where we are.
So if I type ls, which
is for list again,
I see that I can get to pset0 and pset1.
Those are the directories
I can get to from here.
I know that, because the IDE gives
me a clue by coloring them blue.
>> Let's say that I want to
get into my pset1 directory,
because I'm working on problem set 1.
I can type cd-- again, short for
change directory-- space, pset1.
And if I hit Enter, notice what happens.
It doesn't look like a lot has happened.
But if you look at the prompt, it now
tells me that I'm in ~/workspace/pset1.
I've navigated into the pset1
folder that was within my workspace.
>> And if I type ls, I see some
different stuff here, right?
This isn't the same
list that I saw before.
I've navigated into pset1.
And so now, when I type ls, I'm
getting the context of what can I
see from within the pset1 folder.
>> Now, I'm going to type control
l, which just clears the screen.
And I'm going to list the
contents of the directory
again, just so you can see.
I just wanted to do that to
clear out some of the stuff
that you saw down below
and to prevent this
from going too far down out of range.
>> Now, I said earlier that, if I want
to navigate to the current directory,
I can type cd space dot.
Hit Enter.
It doesn't do anything, right?
I'm changing directories
to the current directory.
You're not always going to
find a need for a single dot,
but you will occasionally.
>> Let's say that I want
to move up one level.
I want to get back to
my workspace directory.
I can't type cd workspace,
there's no such file or directory.
And the reason for that--
if I type ls one more time--
is that there is no directory called
workspace inside of my pset1 directory.
I'm going to clear my
screen again with control l.
Remember what I said
earlier, though, that we
can navigate back with dot, dot.
That's the name of the parent directory.
So if I type cd, space, dot,
dot, and then hit Enter,
now look at what happened.
My command prompt tells me that I'm
back in my ~/workspace directory.
I moved up one level,
thanks to dot, dot.
>> Now, let's say that I'm using an
operating system that is Linux-based,
but doesn't necessarily
tell me where I am.
This one happens to tell us that
I'm in ~/workspace right now,
right at the prompt.
But I could be completely
lost in a mess of folders,
and I have no idea where I am and
no idea where I want to get back to.
There's two things that I can do.
>> First of all, I can figure
out where I am, by typing pwd.
That's my present working directory.
And if I hit Enter, it
tells me exactly where I am.
Now /home/ubuntu is the
long way of saying, tilde,
which is your home directory.
But it tells me that I'm in
home/ubuntu/workspace, or ~/workspace.
>> I'm going to navigate to
my pset1 directory again,
and I'm going to list the contents.
And I see that I have another
directory there, called extras.
So I'm going to cd into extras, and
then I'm going to clear my screen.
>> So now, I'm pretty far in, right?
What if I want to back
to workspace immediately?
There's a couple things I could do.
I could type cd, dot, dot, slash, dot,
dot, to move up one level and then
another level.
But that's kind of annoying.
>> So if I ever want to get back to
just my home directory, tilde,
I can type cd with nothing after it.
Cd, Enter.
And now, I'm in tilde.
And if I want to get to workspace,
I can just type cd workspace.
And that's how you work
changing directories
within the CS50 IDE or any Linux
operating system at the command line.
All right.
The next one that might
come in handy is mkdir,
which is short for make a directory,
if I need to create a new folder.
If you're familiar with
the GUI operating system,
you might right-click.
And then, when the context menu
pops up, choose New Folder.
That's probably how
you've done it before.
But we can also create
directories at the command line.
So we're back in the IDE.
I'll zoom-in on the terminal and
list the contents of my directory
again, just to give us
a frame of reference.
Let's say that, now, I've
finished working on problem set 0
and problem set 1.
So I want to create a new directory
to work on for problem set 2.
How do I do that?
>> Well, again, I could right-click in the
left side there and choose New Folder
and create a pset2 directory.
That would work too.
But then I also do it at the
command line pretty quickly,
by typing mkdir, space-- I
typed in n, but-- space pset2.
If I hit Enter and then I list the
contents of my directory again,
I see that, look, now
I have a pset2 folder.
And I can navigate into
that using cd and do
all the work I need to do for pset2.
Incidentally, I'll just pop over
here really quickly to the file tree.
And you can see that, also, in
the graphical File Explorer,
we can see that the pset2 directory
has also been created there.
And I can navigate to it,
using the GUI as well.
The next time and that's
probably going to come in handy
is cp, which is short for copy.
Copy, unlike all the other
commands we've seen before,
takes two arguments, a source, the
name of the file that you want to copy,
and a destination, where you
want to copy the file to.
It's pretty easy to copy
a file, so let's do that.
>> So we're back in the IDE.
I'm going to list the contents
of my current directory with ls.
Now, let's say that I want
to make a copy of hello.txt.
Again, from the file tree on the
left, the graphical interface,
I could right-click on hello.txt,
make a copy, paste the copy.
But I can do it pretty quickly
at the command line too.
>> Let's say I want to copy
hello.txt to hi.txt.
I can cp, space, hello.txt.
That's my source file, so that's why
I'm going to choose that one first.
And then I need to name the
destination file, hi.txt.
I hit Enter.
And if I list the contents of my
directory again, there's hi.txt.
I made a copy of it.
And in fact, if I went
into hi.txt, I could
see that it would be an exact
duplicate of everything that
existed in my hello.txt file.
>> So that's how you copy a file.
But what if you want to
copy an entire directory?
So for a second, let's take a look
at what's in my pset0 directory.
If I cd pset0 and list the contents,
I have a directory called, sample,
and a scratch file, scratch.sb2.
So that's good to know.
So let's clear the screen,
and I'm going to go back
to my workspace directory for a second.
>> Let's say that, now, I want to
make a copy of my pset0 directory.
I can't just say cp pset0
pset3, for instance.
You get this weird message,
omitting directory pset0.
Why do you get that message?
Well, it turns out that, when
you have a directory that
has other stuff inside of it,
the cp command doesn't really
necessarily know what to do with it.
>> We need to explicitly
tell Linux, the terminal,
I want you to copy the
pset0 directory and copy
every folder that exists inside
of it and every file that
exists inside of it.
In other words, I need you to
recursively dive down into pset0
and make a copy of everything in there.
>> If I want to do that, what I can do
is cp-r, for recursive, pset0 pset3.
Hit Enter.
Now, if I list the
contents of my directory,
I see there's the pset3
directory that I can work with.
And if I cd into pset3 now and
then list the contents, look,
there's sample and scratch.sb2 again.
So that's pretty cool.
So that's how you can copy an entire
directory, and not just a single file.
So if you want to copy a
directory, just remember
to use the -r flag when you're
working with the cp command.
All right.
So I've copied a file, but
I've done it by mistake.
And now, I want to get rid of it.
How do I do that?
Again, if you're familiar
with a GUI interface,
you can right-click
and just choose Delete.
And it'll send it to the
trash or the Recycle Bin.
But at the command line, we
can just type rm, for remove,
and then the name of the
file we want to get rid of.
>> Now, rm is very careful.
It does a lot of double-checking,
to make sure that you actually
want to delete the file.
It doesn't want to make any mistakes,
because there's no Recycle Bin here.
Once we delete a file, it's gone.
And there's really no way to recover it.
So we need to be pretty
careful, and so rm
is going to be really careful for us.
>> So let's go back to the IDE
and get rid of that hi.txt file
that I created a minute ago with copy.
So we're in the IDE.
And I list the contents of my directory
again, just to give us some context.
I mean, you can see that there's hi.txt,
which I created a little while ago.
Now, I want to get rid of it.
How do I do it?
>> Again, just rm.
So I can type rm hi.txt and hit Enter.
And there's rm being
really careful for us
and making sure we actually
want to delete this file.
Do you really want to remove
regular empty file hi.txt?
That's just like an operating
system, like Windows or Mac,
that you might be
familiar with popping up
that box says are you really
sure you want to do this.
>> I'm pretty sure I want to this,
so I'm going to type, yes--
or I could also just
type y-- and hit Enter.
And if I list the contents of my
directory again, hi.txt is gone.
Not bad, right?
Let's press Control L, just
to get rid of all this stuff
and get us back at
the top of the screen.
>> Now, there is a way to
short circuit rm, so
that it doesn't ask us that question.
We really know we want
to get rid of that file,
and we don't even want
to be asked the question.
How do we do that?
Well, we can specify an
extra flag, just like we
did with cp where we
could add the -r flag,
to recursively copy into a directory.
There's another flag
for rm, which is -f,
which is to force rm to do exactly
what we're telling it to do.
>> So let's say that, now, I want
to get rid of my hello.txt file.
I don't want that one either.
What can I do?
Well, I can rm -f hello.txt.
What do you think is
going to happen here?
It's gone.
Didn't even ask me the question.
And in fact, if I list the contents
of my directory again, it's gone.
There's no undo here.
hello.txt is gone, and I wasn't
even asked if I wanted to delete it.
What if I want to get rid
of an entire directory?
The way you do that is
very similar to copy.
If you want to delete a
directory, you don't just
want to delete the directory, you want
to delete everything inside of it.
And so you use -r, to
recursively delete a directory.
>> So let's rm -r pset2.
I'm not actually working on pset2,
so I can get rid of that directory.
I hit Enter.
Do I want to remove
the directory, pset2?
Yes, I do.
And if I list the contents of
my directory again, it's gone.
All right?
>> One more variation on this theme.
So I'll clear the screen again,
to put everything at the top.
Hit ls.
Now, I want to get rid
of my pset3 directory,
and I really know I want to
get rid of my pset3 directory.
I can recursively and forcibly
remove my pset3 directory.
>> Now, you're going to be really
careful when you're using rm -rf.
As you program more, it'll be
something you just do really quickly.
And in fact, I do it all the time.
But it can lead to some
disastrous consequences,
if you accidentally
delete the wrong thing.
So I want you to be aware that
this is an option available to you,
but use it sparingly,
and use it with caution.
>> I know for a fact I'm not working
on my problem set 3 anymore, so I'm
going to get rid of all of those files.
And I know I don't want to be asked
every single time if I want to delete
a file, so I'm going to rm -rf pset3.
Didn't even ask me if I
wanted to get rid of it.
I hit ls.
pset3 is gone.
So that's all the variations that you
can use to get rid of files with rm.
>> The last command line command that's
going to pretty useful for you
is mv, which is short for move.
Move Is basically equivalent to rename.
It moves a file from one location to
another, the source to the destination.
Let's see where using a move might
be handy at the terminal window.
>> So I'm in my pset1
directory, and I've noticed
something has gone a little wrong.
I was working on my greedy problem,
but I accidentally named it greddy.
So when I try and run it through
check50, it doesn't really work.
I do have a couple of options.
We could do what we've done before,
which is to make a copy of the file.
I could copy greddy.c
to greedy.c, right?
Hit Enter.
I see that both files are there.
And then I could rm,
to remove, greddy.c.
That gets rid of it.
So that would work, after I confirm
that I want to get rid of it.
And I effectively have
renamed greddy.c to greedy.c.
I copied it, and then
removed the original.
>> But that's a multi-step process.
And certainly, there's a better way.
In fact, there is.
So let's hit Control L,
just to bring this back up,
and list the contents
of my directory again.
>> So let's say, oh, I made a mistake.
I actually really did want
to call that file greddy.c.
In one fell swoop, I can type
move greedy.c to greddy.c.
Hit Enter.
And now, I didn't have
to copy and remove it,
I just was able to rename it.
One-stop shopping.
>> Now, there are a lot of other
basic command line utilities
that you can use with
the Linux command line.
And we'll be discussing a lot
of them in the future in CS50.
But for now, just getting your feet
wet with working with this terminal
environment, these five commands
should get you pretty far
in navigating around and
working with files in your IDE
or in whatever Linux-based
operating system you're using.
>> If you're curious and you want to
look ahead a little bit at some
of the command line commands
we'll be using in the future,
here's a list of a couple
of the more common ones.
I'm Doug Lloyd.
This is CS50.
