UNIX 教程

认识终端

终端是一个允许你通过输入命令与计算机对话的程序。无论你使用什么操作系统(Windows、MacOS、Linux),终端都将是 CS 61A 的重要工具。

继续打开一个终端。终端让你向你的计算机发出命令。试试这个命令:

echo "Hello world"

你的终端将把 "Hello world" 重复回屏幕。echo 命令只是告诉你的终端重复你输入的单词。现在还不太令人印象深刻,但事实证明终端可以做更多的事情!

文件系统

在 Windows 或 MacOS 上,你可能熟悉文件夹和文件,你可以通过拖放图标来与它们交互。今天,我们要去掉图标,只使用终端来管理我们的文件和文件夹!

使用终端,你可以做图形文件系统可以做的所有事情——甚至更多!

目录

我们将使用的第一个命令是 ls(字母 l 和字母 s)。尝试在终端中输入它!

user@computer:~$ ls
Desktop/  Documents/  Downloads/   ...

根据你使用的计算机,输入 ls 后看到的输出可能不同。

ls 命令 lists(列出)当前目录中的所有文件和文件夹。目录 是文件夹的另一个名称(如 Documents 文件夹)。

当你打开终端时,你将 from the home directory(主目录)开始。注意你的提示符(例如 user@computer:~$)中有一个波浪号 ~。你的提示符有帮助地告诉你当前目录——在这种情况下,你的当前目录是 ~,它代表主目录。

创建新目录

我们的下一个命令称为 mkdir。尝试在终端中输入以下命令:

mkdir example

mkdir 命令 makes(创建)一个新的 directory(目录)(即创建一个新文件夹)。注意,与 ls 不同,我们不只是输入 mkdir 并按回车键。我们还需要为命令指定一个 参数(在这个例子中,参数是 example)。对于 mkdir,参数是我们要创建的目录的名称。

有些命令总是需要参数才能工作,比如 mkdir。其他命令可以在不提供任何参数的情况下正常工作,比如 ls

现在我们已经创建了 example 目录,让我们确保它确实在那里。使用 ls 命令验证 example 是否出现在我们的目录列表中。

移动到其他目录

要移动到另一个目录,我们使用 cd 命令。尝试在终端中输入以下命令:

cd example

cd 命令将 change(更改) directories(目录)——换句话说,它 将你移动到指定的文件夹中。在上面的例子中,我们选择移动到 example 目录。

注意提示符中的 ~ 变成了 ~/example。同样,提示符会告诉你当前目录是什么。在这种情况下,我们 在 example 目录中,它位于主目录中(~)。

如果你现在使用 ls 命令,你会注意到没有输出显示。这是有道理的,因为我们刚刚创建了 example 目录,我们还没有向其中添加任何文件。我们稍后会回到这个问题。

现在,让我们回到主目录。有几种方法可以做到这一点:

  • 输入 cd ..(两个点)。.. 表示"父目录"。在这种情况下,example 的父目录恰好是我们的主目录,所以我们可以使用 cd .. 向上移动一个目录。
  • 输入 cd ~(波浪号)。记住 ~ 表示主目录,所以这个命令告诉你的终端更改到主目录,无论你现在在哪里。
  • 输入 cd(即不带参数的 cd 命令)。在 UNIX 中,只输入 cd 是输入 cd ~ 的快捷方式。

删除目录

我们现在知道如何查看、创建和移动到目录。我们涉及目录的最后一个命令将是使用 rm 命令删除它们。

首先,让我们创建一个临时目录:

mkdir tmp

如果你使用 ls 命令,你现在应该看到 tmp 列为一个目录。

接下来,让我们删除 tmp 目录:

rm -r tmp

rm 命令将从你的文件系统中 remove(移除)文件和目录。它本身(即没有 -rrm 命令只移除文件。但是,由于我们要移除一个目录,我们需要指定 -r递归地移除 tmp 目录和 tmp 可能包含的任何文件(这个过程称为"递归",因为为了移除 tmp,我们必须移除 tmp 内的所有内容)。

正如你所看到的,有些命令需要参数,比如 mkdir。其他命令不需要任何参数即可工作,比如 ls。此外,大多数命令也可以被赋予 标志,比如 rm-r。标志是指定命令修改行为的方式——例如,rm 本身只移除文件;使用 -r 告诉 rm 移除目录。

目录摘要

到目前为止,我们已经学习了如何对目录(文件夹)执行以下操作:

  • lslist(列出)当前目录中的文件和文件夹
  • mkdirmake(创建)一个新的 directory(目录)
  • cdchange(更改) directories(目录)
  • rm -rremove(移除)指定的目录

文件

如果目录不包含任何文件,它们就不是很有用。在本节中,我们将介绍一些允许你与文件交互的命令。

对于本节,让我们回到主目录。回想一下,我们可以通过简单地输入

cd

到我们的终端来做到这一点。你的提示符现在应该显示 ~

创建文件

有许多不同的方法可以创建文件。对于这个课程,你通常使用文本编辑器直接编写文件,就像你在 Microsoft Word 中编辑 Word 文档一样。

现在,我们只需下载一个名为 unix.txt 的文件,它可以 在这里 找到。在这个课程中,你将通过下载文件来开始大多数作业和项目。

学校计算机上下载的默认位置是在 Downloads 目录中。让我们使用我们的 cd 命令更改到该目录。

cd ~/Downloads

你可以使用 ls 命令验证你的 unix.txt 在这个目录中。

移动文件

在 Windows 和 Mac 上,你与文件的大部分交互可能是将它们从一个文件夹拖到另一个文件夹。UNIX 提供了一种使用 mv 命令移动文件的方法。

记住我们创建了一个目录叫做 example。让我们将 unix.txt 移动到 example 中:

mv unix.txt ~/example

mv 命令 moves(移动)一个文件/目录到另一个文件/目录。在这里,我们将 unix.txt 文件移动到 example 目录中,它在主目录内。

要验证 mv 命令是否工作,请执行以下操作:

  1. 使用 ls 检查 unix.txt 不再在我们的当前目录中(即 Downloads 目录)。
  2. 更改到 example 目录。你的提示符现在应该显示 ~/example
  3. 使用 ls 验证 unix.txt 出现在 example 中。

读取文件:快速简便的方法

文件很有用,因为它们包含信息。让我们看看 unix.txt 包含什么。输入以下命令:

cat unix.txt

这会打印出我们目前看到的所有有用的 UNIX 命令的列表。cat 命令将文件的内容打印到屏幕上。这是验证文件是否正确或读取文件包含内容的快速方法。例如,如果你忘记本文中的任何 UNIX 命令,你可以快速 cat unix.txt 来阅读它们。

重命名文件

要在 Windows 或 MacOS 上重命名文件,你会点击文件名然后输入新名称。

使用终端重命名文件一开始可能有点令人困惑。尝试在终端中输入以下命令(从 example 目录)

mv unix.txt unix_commands.txt

使用 ls,你会看到 unix.txt 消失了——取而代之的是一个名为 unix_commands.txt 的文件。此外,输入 cat unix_commands.txt 将打印出相同的 UNIX 命令列表。

看来我们通过使用 mv 命令将 unix.txt 重命名为 unix_commands.txt!以下是如何思考它:

  • mv 会将文件/目录的内容移动到另一个文件/目录。在上一节中,我们将一个文件移动到了一个目录中。
  • 这一次,我们将一个文件(unix.txt)的内容移动到另一个文件(unix_commands.txt)中。虽然我们技术上是在移动文件内容,但这实际上与重命名文件是一回事!

如果你是第一次看到这个,可能会有点困惑,所以 在继续下一节之前,请确保你理解了它。

注意:假设你已经有两个文件,alice.txtbob.txt,然后你发出命令:

mv alice.txt bob.txt

这将用 alice.txt 的内容覆盖 bob.txt 的旧内容!UNIX 不会警告你覆盖,所以使用 mv 命令时要小心!

复制文件

有时,拥有多个文件副本很有用。尝试以下命令:

cp unix_commands.txt new_file.txt

cp 命令 copies(复制)一个文件的内容到另一个文件中。使用 ls,你会看到 example 目录现在包含 两个文件,unix_commands.txtnew_file.txt。使用 cat 将验证两个文件具有相同的内容。

假设我们还想将 unix_commands.txt 文件复制到我们的主目录。这是一种方法:

  1. 更改回到主目录。 (挑战:尝试在不查看命令的情况下做到这一点!)
  2. 接下来,使用以下命令:

    cp example/unix_commands.txt .

    不要忘记末尾的点!

第一个参数(example/unix_commands.txt)告诉终端在 example 目录中查找 unix_commands.txt

第二个参数 . 告诉终端将 unix_commands.txt 复制到目录 .。就像两个点(..)代表父目录一样,单个点(.)代表当前目录(我们现在所在的目录)。

现在我们在主目录中,我们可以使用 ls 来验证 是否有 unix_commands.txt 的副本:

user@computer:~$ ls
Desktop/ ... unix_commands.txt ...

使用 cat unix_commands.txt 将显示相同的 UNIX 命令输出。

回顾:我们看到了两个特殊的目录:两个点 .. 代表父目录(向上一个目录),而单个点 . 代表当前目录。你可以将这些特殊表达式与任何处理目录的命令一起使用。例如,你可以将文件 mv 到当前目录,命令为

mv some_file .

删除文件

回想一下我们前面介绍rm 命令。我们最初使用 -r 标志来删除目录。现在我们将使用不带 -rrm 来删除文件。在终端中输入:

rm unix_commands.txt

这将删除我们当前目录(即主目录)中的 unix_commands.txt 副本。快速的 ls 将向你显示 unix_commands.txt 不见了。

警告:与 Windows 和 MacOS 不同,没有友好的回收站或垃圾箱可以从中恢复已删除的文件。在 UNIX 中,当你 rm 一个文件时,它就消失了。你不能"撤消"rm,所以在使用 rm 命令之前要三思(甚至四思!)!。

文件摘要

在本节中,我们学习了操作文件的基础知识:

  • cat:在屏幕上显示文件的内容
  • mvmoves(移动)文件/目录到另一个文件/目录。当将一个文件移动到另一个文件时,我们实际上是重命名了文件!
  • cpcopies(复制)文件到另一个文件/目录。
  • rmremoves(移除)文件。当使用 -r 标志时,rm 将删除目录。

此外,我们学习了两个特殊的目录:..(父目录)和 .(当前目录)。

获取帮助

如果你遇到不熟悉终端命令,你可以使用一个名为 man 的命令:

man ls

man 命令将显示另一个命令的手册页(参考页)。在上面的例子中,我们要求终端显示 ls 命令的手册页。当你浏览手册页时,你会注意到 ls 可以做的不仅仅是从目录中列出内容!man 是了解更多关于新命令甚至你认为已经知道的命令的好方法。

注意:有些学校计算机没有安装 man 命令,所以你可能会收到错误。没关系——如果 man 失败,Google 是你的朋友!

结论

虽然 CS 61A 中的主要编程语言是 Python,但了解如何浏览 UNIX 文件系统以管理你的课程作业是很重要的。你还将从终端与 Python 解释器交互,无论你使用的是学校计算机还是家庭计算机。

此外,如果你在 61A 之后继续学习计算机科学,你肯定会更多地与 UNIX 和终端交互。

附录

术语

  • 终端:允许用户输入命令以控制计算机的程序
  • 提示符:每次终端准备好接收新命令时显示某些信息。例如,你的提示符可能看起来像这样:

    user@computer~$

    通常,提示符会告诉你当前目录(在上面的例子中,当前目录是 ~

  • 目录:与文件夹相同。目录可以包含文件和 其他目录
  • 父目录:紧接在当前目录上方的目录(即向上一个目录)。这在 UNIX 中表示为两个点,..
  • 当前目录:我们当前正在查看的目录。这在 UNIX 中表示为单个点,.
  • 主目录:包含你的所有文件和子目录的顶级目录。这在 UNIX 中表示为波浪号, ~

UNIX 命令

  • 目录:

    • lslist(列出)当前目录中的文件和文件夹
    • mkdirmake(创建)一个新的 directory(目录)。例如,mkdir example 创建一个名为 example 的目录
    • cdchange(更改) directories(目录)。例如,cd example 将目录更改为 example
    • rm -r:递归地 remove(移除)指定的目录。例如,rm -r example 移除 example 目录及其中的所有文件和子目录。
  • 文件:

    • cat:在屏幕上显示文件的内容。例如,cat unix.txt 显示文件 unix.txt 的内容
    • mvmoves(移动)文件/目录到另一个文件/目录。例如,mv file1 file2file1 的内容移动到名为 file2 的(可能是新的)文件中。当将一个文件移动到另一个文件时,我们实际上是重命名了文件!
    • cpcopies(复制)文件到另一个文件/目录。例如,cp file1 file2file1 的内容复制到名为 file2 的文件中。
    • rmremoves(移除)文件。例如,rm file1 删除名为 file1 的文件。
  • 杂项:

    • echo:在屏幕上显示单词
    • man:显示指定命令的手册