您是一名初学者 GNU/Linux 用户,希望超越常规的窗口拖拽和鼠标点击吗?本指南旨在面向希望学习 GNU/Linux 命令行基础知识的绝对初学者用户。本教程旨在介绍与导航、文件和目录管理、软件安装以及基本系统故障排除相关的基本 Linux 命令。
在本教程中,您将学到:
如何使用 Linux 命令
类别 | 要求、约定或使用的软件版本 |
---|---|
系统 | 任何 Linux 系统 |
软件 | Bash shell Bash shell |
其他 | 特权访问您的 Linux 系统,可以通过 root 用户或 sudo 命令实现。 |
大会 | # - 要求给定的 Linux 命令以 root 权限直接作为 root 用户执行,或者通过 sudo 命令执行 $ - 要求给定的 Linux 命令以普通非特权用户的身份执行 |
GNU/Linux 命令行是什么
每当你听到有人谈论 GNU/Linux 操作系统时,你也会听到他们谈论命令行或 Linux 命令。运行这个命令,执行这个命令和那个命令!对吧?
然而,为什么?为什么 GNU/Linux 操作系统几乎总是与命令和命令行相关联?简单的答案是命令行是 GNU/Linux 操作系统的一个组成部分,因此它为用户提供了更高效地执行任务、更精确地执行任务,最重要的是提供了有关整个执行过程的额外见解信息的可能性。
许多 GNU/Linux 的初学者将命令行和 Linux 命令与恐惧、高级巫术技能和不必要的开销联系在一起。
让我们对自己诚实一点吧!无论你对 GNU/Linux 系统及其命令行有什么借口,导致你厌恶的原因很可能与缺乏理解和不愿学习有关。
因此,让我们不要因我们的缺点而责怪 GNU/Linux 系统!它在这里帮助你,无论你是完全初学者还是高级用户。系统能够帮助你到什么程度并不取决于你的钱包深度,就像一些其他专有操作系统一样!你从 GNU/Linux 系统获得的帮助取决于你学习的意愿和决心。
在这个阶段,我相信你正在问自己的问题是:我需要学习 GNU/Linux 命令行和大量的命令来使用 GNU/Linux 操作系统吗?简短的答案是否定的!任何一个装有图形用户界面的体面的 GNU/Linux 操作系统都不需要用户使用命令行来执行基本甚至高级的任务。
学习 GNU/Linux 命令行的唯一原因是为了提高效率,充分利用系统,并且如果面临的任务需要这样做。记住,许多 GNU/Linux 用户多年来甚至不知道什么是命令行!不了解 Linux 命令行是完全可以的,如果系统能满足您的需求,甚至不需要学习最基本的命令。
No matter what flavour of GNU/Linux operating system you are using, whether it has Graphical User Interface or not, the command line is always present in some form.
Hence, if you know the command line basics, you still feel at home regardless of the system in use. Command line, by use of the variety of commands, allows you to administer the system and perform even the most complex tasks on any the GNU/Linux system without GUI as well as remotely across the long distances seemingly making you feel you are sitting right in front of the computer.
However, to do so, one needs to possess at least the rudimentary understanding of the GNU/Linux command line and learn some basic usage of some of the commands it offers. Do not be afraid, as this is precisely what you are going to learn by reading this Linux commands tutorial.
What are Linux Commands
Linux 命令是整个 GNU/Linux 操作系统的精髓,用于管理整个系统。你可能不知道,但你在图形用户界面中运行的大多数应用程序在后台为你执行 Linux 命令来完成给定的任务。
让应用程序自动运行 Linux 命令为我们带来了许多明显的好处。然而,缺点是在许多情况下,我们无法自定义命令执行以使其朝着期望的结果发展。此外,如果出现问题,用户很可能被留在黑暗中,没有任何提示甚至开始解决问题。
现在你可能会想:好的,这一切都很好,但有多少命令,我应该学习所有的命令吗?在你的 GNU/Linux 系统上可用的 Linux 命令数量是无关紧要的,因为这个数字在每个系统中总是不同的。然而,如果你坚持要知道确切的数量,请在你的终端中执行以下命令:
$ for i in ${PATH//:/ }; do ls $i; done | sort | uniq | wc -l
您系统上可用的命令数量会有所不同。总的来说,GNU/Linux 操作系统上可能包含数千个命令,这也最终回答了我们接下来的问题,即用户是否需要学习所有这些命令。嗯,您可以尝试,但这个探索注定会以失败告终。
因此,最好的方法是从基础知识开始;绝对必须学会的 Linux 命令,以帮助您浏览 GNU/Linux 文件系统并执行基本的管理任务。一旦您完成了这项任务,并且对 Linux 命令行感到自信,剩下的事情就会自然而然地随着最小的努力而来,只需简单地使用 GNU/Linux 系统。您所需要的只是一颗开放的心和决心。
好了,别再闲聊了,让我们开始吧!
基本文件系统和导航 Linux 命令
命令行参数、选项和参数
理解 Linux 命令行参数、选项和参数之间的区别可能是要完全理解 GNU/Linux 命令行的最关键部分。因此,在继续下一部分之前,请务必不要跳过此主题,而是确保您彻底理解它。
解释 Linux 命令行参数、选项和参数之间区别的最佳工具是 ls 命令。如果您还不了解 ls 命令,不要担心,因为该命令将在后面的部分详细介绍。打开终端并运行以下命令。不要输入$符号,因为此符号仅用于通知您这是要在命令行上执行的命令,并且应以普通非特权用户身份执行:
$ ls
在您输入上述命令并按下回车键后,该命令会列出当前目录中的所有文件和目录。暂时忽略命令的输出,并注意该命令由一个单一参数组成,即命令 ls 本身。我们将这个参数称为参数 0。接下来,请尝试这个命令:
$ ls -a
上述命令由两个参数组成。第一个参数被称为参数 0,是 ls 命令本身,第二个参数被编号为 1,是 ls 命令的选项-a。
命令选项允许用户修改命令输出。每个 Linux 命令都有不同的选项集。命令选项是硬编码到命令本身中的。顾名思义,命令选项是可选的,用户不需要使用它们。在这种情况下,ls 命令的选项-a 指示命令打印位于我们目录中的隐藏文件或目录。
在您的主目录中运行以下命令:
$ ls -l .bashrc
如果您遵循,您已经知道上述命令由三个参数组成。首先,是命令本身的 0 参数。第二个参数,更确切地说,参数 1 是 ls 命令的选项-l,它指示 ls 命令生成长列表输出,为用户提供有关一个或多个文件的更多信息。最后,第三个参数编号 2 是提供给 ls 命令的参数,告诉命令仅对名为.bashrc 的单个文件执行操作。
快速提示:请注意,在上述 .bashrc 文件的情况下,前缀 . 是文件名的一部分,并且表示该文件是隐藏的。隐藏意味着 ls 命令默认情况下不会将此文件列为其输出的一部分,除非使用 -a 选项。
参数是一个命令行参数,它为命令本身或其一个或多个选项提供额外信息。根据您正在执行的命令,您可以提供一个或多个选项或参数。考虑以下示例:
$ ls -l -h .bashrc .bash_history
$ ls -l -h .bashrc .bash_history $ ls -l -h .bashrc .bash_history
在这种情况下,我们的命令由五个参数组成。有 ls 命令,两个选项,即-l 和-h,最后有两个文件名作为参数,即.bashrc 和.bash_history 文件。
在命令行上提供所有参数的顺序取决于您正在执行的 Linux 命令。然而,推荐的通用规则是在命令后面提供所有所需选项,然后是所有所需参数。例如,下面也是一个有效的命令,它产生与上面相同的输出,但应避免使用这种命令语法:
$ ls .bashrc -l .bash_history -h
最后,为了缩短您的命令,使其更易读,大多数命令允许用户将多个选项组合成单个参数。这意味着可以将选项-l 和-h 组合成一个单一参数,如-lh。例如:
$ ls -lh .bashrc .bash_history
以下视频总结了整个部分。到目前为止,您应该清楚地了解什么是命令行参数、选项和参数。
文件系统导航
本节涵盖了 Linux 命令行的另一个基本部分,即文件系统导航。多年来,我看到许多用户很难理解 GNU/Linux 文件系统导航,因为它与通常的 C: 或 D: 驱动器有很大不同。在本节中,您还将学习前两个 Linux 命令,即 cd 命令和 pwd 命令。
让我们从以下声明开始:忘记其他专有操作系统中你所熟知的 C:或 D:驱动器。这种知识在这里不适用,只会让你感到困惑。
GNU/Linux 文件系统允许从整个文件系统中的任何目录访问任何硬盘或分区。然而,在这个阶段,我们不应该担心这个问题。
或许描述 GNU/Linux 文件系统的最佳类比是我已经在我的 Bash 脚本教程中使用过的一个。想象 GNU/Linux 文件系统就像一座多层建筑。所谓的根目录(建筑的入口门)由/表示,提供了整个文件系统(建筑)的入口,因此可以访问所有目录(层次/房间)和文件(人)。
要导航到三楼的 1 号房间,我们首先需要进入主门,然后前往三楼,并从那里进入 1 号房间。因此,在建筑物内到达这个特定房间的绝对路径是/三楼/1 号房间。从这里,如果我们想参观三楼的 2 号房间,我们首先需要离开我们当前的位置,也就是 1 号房间,通过输入../,然后包括房间的名称 2 号房间。我们采用了相对路径到 2 号房间,即../2 号房间。我们已经在三楼,所以无需离开整栋建筑物并通过主入口/三楼/2 号房间采用绝对路径。
混乱?不用担心,在与 GNU/Linux 命令行进行几次会话后,知识会渗透进来,变成你的第二天性。
信不信由你,GNU/Linux 操作系统为所有用户提供了一个指南针,以帮助文件系统导航,这就是 pwd(打印工作目录)命令。每当你迷失方向时,只需输入 pwd 命令,它会显示给你路径。现在试一试。打开终端,输入 pwd,然后按回车键:
$ pwd
默认情况下,您的起始工作目录始终是您的主目录。每个非系统用户的目录位于/home 目录中。如上图所示,用户 linuxconfig 的主目录的绝对路径是/home/linuxconfig。如果您的系统包括用户“john”,那么该用户主目录的绝对路径是/home/john。
快速提示:对任何用户主目录的访问仅限于拥有该目录的实际用户和在 GNU/Linux 情况下是根用户的管理员。
在这个阶段,我们应该知道如何在命令行上输入命令,我们也知道如何获取我们在文件系统中的当前位置。现在是时候开始移动了。为了做到这一点,我们使用 cd(更改目录)命令。cd 命令允许用户在用户具有适当访问权限的情况下导航到文件系统中的任何目录。
尝试执行以下命令,不要害怕尝试。不要忘记你的个人指南针,pwd 命令,可以立即告诉你当前位置。请确保用你自己的用户名替换下面的 linuxconfig 用户:
除了第 5 行和第 6 行之外,上述命令应该是不言自明的。在第 5 行,我们使用了快捷方式../来移动到 linuxconfig 目录的父目录。在第 6 行,我们向上移动了两个目录,最终导航到 etc 目录。
Exercise:Execute the
cd
command without any arguments to instantly navigate to your user home directory from any location. Execute cd -
to toggle between your last two visited locations. In what directory do you end up after executing cd ~
and cd .
commands?练习:执行 cd 命令而不带任何参数,即可立即从任何位置导航到您的用户主目录。执行 cd -以在您最后访问的两个位置之间切换。执行 cd ~和 cd .命令后,您会在哪个目录中?
Exercise:Can you tell the difference between the absolute and relative path? Looking at the above image can you count how many times we have used absolute vs relative path when navigating the filesystem using the
cd
command?HINT: The absolute path always starts with the /
character.练习:您能区分绝对路径和相对路径吗?看着上面的图片,您能数一下我们在使用 cd 命令导航文件系统时使用绝对路径和相对路径的次数吗?提示:绝对路径总是以 / 字符开头。
穿越 GNU/Linux 文件系统并理解绝对路径和相对路径之间的区别对于任何初学者来说都不是一个容易的话题。在继续之前,请确保您对 cd Linux 命令和目录之间的导航感到自在,因为这些知识将在接下来的部分中为您提供帮助。
列出目录内容
到目前为止,您应该已经熟悉使用 cd 命令进行文件系统导航,并且对 GNU/Linux 命令行有基本的了解,包括命令行参数、选项和参数。到目前为止,我们已经学会了如何导航到任何目录,但还没有学会如何列出目录内容。列出目录内容是本节的主要内容。
用于列出任何目录内容的工具是 ls 命令。现在试试吧。打开终端,在您的主目录中输入 ls 命令,不带任何选项或参数:
$ ls
通过在不使用任何选项或参数的情况下执行 ls 命令,该命令会列出当前工作目录的内容。许多现代终端通过将目录着色为蓝色,常规文件着色为白色,可执行文件着色为绿色,为用户提供额外信息。请注意,许多终端不提供这种奢侈,因此我们需要学会如何使用 ls 命令手动区分各种类型的目录内容项。
快速提示:大多数命令都附带一个手册页面,可用于了解其功能以及每个特定命令接受的参数。使用 man 命令显示任何所需命令的手册页面。例如,要显示 ls 命令的手册页面,请执行 man ls。要退出手册页面,请按 q 键。
正如我们在之前的章节中已经学到的那样,通过使用预先编程的选项,可以修改命令的输出。在这种情况下,-l 选项,也被称为长列表,会向默认的 ls 输出添加更多信息:
$ ls -l
通过使用-l 选项,ls 命令为用户提供额外信息,如权限、用户或组所有权、文件大小和修改时间。
另一个常见的 ls 命令选项是-a,它列出目录中的所有文件和隐藏文件或目录。任何文件或目录的名称前缀为.的都是隐藏的,因此不会作为默认 ls 命令输出的一部分。
$ ls -a
ls 命令的许多选项只有与其他选项结合使用时才有意义。例如,要显示任何选定文件的文件大小,用户可以向 ls 命令提供-l 选项,并将实际文件名作为参数。考虑以下 ls 命令示例,以显示 image.jpg 文件的大小:
$ ls -l image.jpg
默认情况下,ls 命令以字节显示文件大小,除非提供-h(人类可读)选项。请注意,-h 选项在未与-l 选项组合提供时没有意义。
在这一点上,重要的是要注意,通过使用参数,用户可以列出整个文件系统中的任何目录或查找有关任何文件的信息,而无需离开他们的主目录。要这样做,只需将要列出更多信息的文件或目录的绝对或相对路径作为参数提供给 ls 命令。尝试以下 ls 命令示例:
$ ls /etc/systemd $ ls -l ../ $ ls -lh /etc/services
练习:使用 ls 命令的手册页面,看看是否可以找到一种方法,按文件大小降序显示/etc 目录的内容。
创建一个目录
目录的目的是为了保持文件系统,因此我们和系统文件有组织地排列。在本节中,您将学习如何在 GNU/Linux 命令行上使用 mkdir 命令创建目录。
在 GNU/Linux 系统上创建一个目录就像执行 mkdir 命令一样简单,同时将所需的目录名称作为参数。现在试试吧。打开终端并在您的主目录中创建一个名为 dir1 的新目录。
$ mkdir dir1
快速提示:避免创建文件和目录时使用空格作为名称的一部分。在 Linux 中,可以通过用引号括起名称来创建带有空格的目录或文件名,例如 mkdir "my files",但这可能会在以后造成问题,因此务必避免!如果需要在文件或目录名称中使用空格,则请使用下划线_代替。
接下来,使用 ls 命令列出当前工作目录的内容,如果目录已经正确创建,您应该在命令输出中看到它。
与在当前工作目录内创建目录相同,您也可以在文件系统的任何位置创建目录,前提是您有适当的权限。现在让我们在 /tmp 目录中创建一个名为 example 的新目录。
另一种解决方案是通过仅仅在新目录名称前加上正确的绝对或相对路径来创建目录,新示例目录将被创建的目录的路径。因此,在执行 mkdir 命令之前,无需使用 cd 命令移动到/tmp/目录:
$ mkdir /tmp/example
关于 mkdir 命令没有太多需要学习的内容。只要你理解之前解释过的绝对路径和相对路径之间的区别,就可以了。与 mkdir 命令一起常用的只有另一个选项,那就是-p 选项。
假设您希望在现有目录 dir1 中创建一个新目录 dir2,并在 dir2 中创建新的 dir3。第一个解决方案是首先创建 dir2,然后执行第二个 mkdir 命令来在 dir2 目录中创建 dir3。然而,使用-p 选项,可以通过单个 mkdir 命令执行来实现这一目标:
$ mkdir -p dir1/dir2/dir3
练习:使用您的用户帐户,尝试在 /etc 目录中创建一个名为 my_dir 的目录。它能成功吗?如果不能,为什么?
创建文件并读取文件内容
GNU/Linux 系统将大部分关于设置、配置以及数据(如日志)的信息存储在纯 ASCII 文本文件的形式中。因此,任何用户至少都需要基本的文本文件操作理解。
在本节中,您将学习如何创建文件,读取文件内容以及如何使用基于简单命令行的文本文件编辑器编辑文本文件。
让我们从在我们的主目录中创建一个名为 file1 的空文件开始。为此,我们使用 touch 命令。打开您的终端并输入以下 Linux 命令:
$ touch file1
这就是全部内容!您现在已成功在您的主目录中创建了一个名为 file1 的新文件。立即执行 ls 命令,您应该会看到这个新文件位于您的主目录中。
也许你已经注意到,我们创建了一个没有扩展名如.txt 或.exe 的文件。请注意,在 GNU/Linux 系统上,文件扩展名大多没有任何意义,除了当执行 ls 命令列出所有文件和目录时,立即就能看出带有.txt 扩展名的文件很可能是 ASCII 文本文件,而带有.png 扩展名的文件很可能是图像文件。
在这一点上,重要的是指出,在 GNU/Linux 操作系统上创建文件有许多方法。实际上,你很少需要像之前所做的那样创建一个空文件。事实上,touch 命令的主要目的并不是创建文件,而是操作文件的时间戳,这是另一个故事的内容。
由于文件的主要目的是存储数据,我们将做到这一点。让我们使用一个名为 nano 的文本文件编辑器来创建一个名为 todo-list.txt 的新文件,其中包含一些任意文本。首先执行以下命令:
$ nano todo-list.txt
一旦执行 nano 命令,nano 编辑器将打开,让您编辑新的 todo-list.txt 文件的内容。在 nano 编辑器中根据需要对文件内容进行任何修改。
准备好后,按下 CTRL+o,然后按回车键保存文件。此时,将创建新的 todo-list.txt 文件。要退出 nano 编辑器,请按下 CTRL+x 键组合,如下图所示:
您可以通过将文件名作为参数指定给 nano 文本编辑器命令来继续编辑任何现有的文本文件。
到目前为止,我们已经学会了如何使用命令行文本编辑器创建文件以及如何编辑现有或新的文本文件。我们还没有涉及的是如何读取文本文件的内容。坦率地说,这并不复杂!您可以使用 cat GNU/Linux 命令来读取任何文件的内容。
立即尝试。执行 cat 命令,并提供您希望检查的文件的名称作为参数。例如:
$ cat todo-list.txt
练习:有些文件可能跨越数千行。尝试使用 cat 命令查找/etc/services 文件的内容。一些终端有限制的行数和没有滚动条。因此,仅仅使用 cat 命令无法阅读大型文本文件的内容。尝试使用 less 或 more 等命令来阅读/etc/services 文件的内容。
在我们将这一部分标记为“完成”的之前,还有一个命令您应该熟悉一下。这个命令叫做 file。
记住,之前我们谈到过,文件名后缀并不是必需的。那么,如果是这种情况,我们要如何知道存储在我们的主目录或 GNU/Linux 文件系统的任何地方的文件类型呢?这就是 file 命令派上用场的地方。file 命令会输出作为参数提供的任何文件的文件类型。现在试一试:
$ file todo-list.txt
重命名或移动文件和目录
另一个逻辑步骤是学习如何重命名或移动文件和目录。到目前为止,我们已经讨论了如何创建文件或目录,但是如何将现有目录或文件移动到另一个位置呢?嗯,您应该高兴地知道,在 GNU/Linux 系统下移动和重命名文件或目录本质上是相同的。
在 GNU/Linux 文件系统上重命名和移动文件是一项简单的任务。所需的只是 mv 命令和对绝对路径和相对路径的理解,正如上面文件系统导航部分所介绍的那样。
考虑以下示例:
$ touch file1 $ mkdir dir1
使用上述的 touch 和 mkdir 命令,我们已经创建了一个名为 file1 的文件和一个名为 dir1 的目录。touch 和 mkdir 命令的用法已经在之前介绍过,因此不需要再解释。
任务是使用 mv 命令将 file1 重命名为 file2,将 dir1 重命名为 dir2。为此,我们需要向 mv 命令提供要重命名的文件或目录的绝对或相对路径作为第一个参数。第二个必需参数是我们希望将我们的文件或目录重命名为的绝对或相对路径:
$ mv file1 file2 $ mv dir1 dir2
这里需要理解的一点是,GNU/Linux 没有专门的命令来重命名文件。相反,mv(缩写为 move)命令用于将文件或目录从一个位置移动到另一个位置,同时在此过程中更改它们的名称。考虑以下示例:
$ mv file2 /tmp/file3 $ mv dir2 /tmp/dir2
第一条命令已将 file2 移动到目录/tmp/并将其重命名为 file3。第二条命令已将 dir2 移动到/tmp/,由于我们提供了相同的目标目录名称,因此目录名称保持不变。
因此,第二个命令实质上只是将源目录 dir2 移动到目标目录/tmp/,因此不需要第二个参数指定新目录名称,可以简单地执行如下:
$ mv dir2 /tmp/
理解上述 mv 命令是至关重要的,因为 mv 命令还具有接受多个参数的能力。也就是说,可以通过执行单个 mv 命令同时移动多个目录和/或文件:
$ mkdir dir4 dir5 $ touch file4 file5 $ mv file4 dir4 file5 dir5 /tmp
快速提示:在使用多个 mv 命令参数时,唯一需要遵循的规则是,如果向 mv 命令提供了多个源参数,则最后提供的参数必须是一个目录。
上述 mv 命令已将多个文件和目录移动到新位置:/tmp 目录。这里需要指出的是,无论您向 mv 命令提供多少个源文件或目录作为参数,最后提供的参数都被视为目标位置。
在我们转移到另一个话题之前,重要提及一个可能会造成损害的事实是关于 mv 命令。
如果提供给 mv 命令的目标文件参数已经存在,它可能会被覆盖而没有警告,因此这个操作有潜力不可逆地删除您的数据,无法恢复。考虑以下 mv 命令示例:
$ cat /tmp/sample.txt linuxconfig.org $ touch sample.txt $ mv sample.txt /tmp/sample.txt $ cat /tmp/sample.txt $
如果不确定,请使用-i 选项指示 mv 命令在目标文件已经存在的情况下发出警告。示例:
$ mv -i sample.txt /tmp/sample.txt mv: overwrite '/tmp/sample.txt'?
下面的图片展示了 mv 命令在本节中的操作:
复制文件和目录
在前一节中,我们讨论了如何通过使用 mv GNU/Linux 命令将文件和目录从一个位置移动到另一个位置。本节涵盖了一个类似的主题,即如何通过使用 cp 命令复制文件和目录。
大部分从前一节中收集的知识将帮助我们学习 cp GNU/Linux 命令,因为 mv 和 cp 命令的语法非常相似。主要区别在于,cp 命令不是移动文件或目录,而是创建源文件或目录的精确副本。
就像 mv 命令一样,cp 命令也需要至少提供两个参数。第一个参数是源文件或目录,第二个参数是目标文件或目录。
让我们从一个简单的例子开始,创建一个位于我们家目录中的文件的副本。首先,我们使用 touch 命令创建一个名为 file1 的新文件,然后我们制作一个名为 file2 的精确副本:
$ touch file1 $ cp file1 file2
这里的一个相当明显的规则是,提供给 cp 命令的源和目的地参数不能相同:
$ cp file1 file1 cp: 'file1' and 'file1' are the same file
唯一的方法是为源参数和目标参数提供完全相同的文件名,这是将文件复制到不同目录中,可以使用绝对路径或相对路径。以下 cp 命令示例将文件 1 复制到目录/tmp 中:
$ cp file1 /tmp/file1
然而,如果您没有更改文件名的意图,根本不需要将文件名作为目标参数提供。因此,上述命令可以简写为:
$ cp file1 /tmp/
练习:通过执行单个 cp 命令,将/etc/services 文件复制到您的主目录,并将其重命名为 port-numbers.txt。
您可以使用相同的 cp 命令语法来复制一个目录。然而,有一个重要的区别,那就是要复制一个目录,我们需要使用-r(递归)cp 命令选项。请考虑以下示例:
$ mkdir dir1 $ cp dir1 /tmp/ cp: -r not specified; omitting directory 'dir1' $ cp -r dir1 /tmp
就像 GNU/Linux mv 命令一样,cp 命令也接受多个参数。这意味着可以通过执行单个 cp 命令同时复制多个文件和目录。
规则是最后一个参数必须是一个目录。查看以下示例,我们首先创建另一个示例目录和文件。接下来,我们将此目录与其他两个文件一起复制到 /tmp/ 目录中:
$ mkdir dir2 $ touch file1 file2 $ cp -r dir2/ file1 file2 /tmp/
如果提供给 cp 命令的目标文件参数已经存在,它可能会在没有警告的情况下被覆盖,因此这个操作有潜力不可逆地删除您的数据,无法恢复。在某些情况下,这种行为对目录也是有效的!考虑以下 cp 命令示例:
$ cat sample.txt linuxconfig.org $ touch /tmp/sample.txt $ cp /tmp/sample.txt sample.txt $ cat sample.txt $
如果不确定,请使用-i 选项指示 cp 命令在目标文件已经存在的情况下发出警告。示例:
$ cp -i /tmp/sample.txt sample.txt cp: overwrite 'sample.txt'?
下图展示了本节中描述的 cp 命令的操作:
删除文件和目录
在这个阶段,您应该对 Linux 命令行基础非常自信。您可能已经注意到了使用命令的模式。您应该知道如何创建、移动和重命名任何文件或目录。然而,如果不知道如何删除文件或目录,您的文件系统会填满,因此存储更多数据的能力将会丧失。
本节将介绍两个命令。第一个命令是 rmdir,第二个命令是 rm。当看到 rmdir 和 rm 两个命令的名称时,您可能会迅速得出结论,即 rmdir 命令用于删除目录,而后一个命令 rm 用于删除文件,大多数情况下您是正确的。让我们首先看一下 rmdir 命令。
对于我们的实验,我们将使用包含多个子目录和文件的以下目录结构。我们的目标是学习如何使用 rmdir 和 rm 命令来删除所有文件和目录:
与您已经学过的任何 GNU/Linux 命令一样,rmdir 命令也接受多个参数。例如,要删除 dir4,我们只需要向 rmdir 命令提供要删除的目录名称作为参数:
$ rmdir my_files/dir4/
简单吧?现在让我们删除下一个目录,比如说 dir1:
$ rmdir my_files/dir1 rmdir: failed to remove 'my_files/dir1': Directory not empty
正如您所看到的,上述 rmdir 命令未能删除 dir1 目录。rmdir 的主要作用是删除目录,由于目录 dir1 包含文件,rmdir 命令跳过了该目录,并显示错误消息,指出该目录不为空。
逻辑是正确的!删除非空目录的唯一方法是使用 rmdir 的相当长的命令行选项--ignore-fail-on-non-empty。然而,在这一点上,使用 rm 命令要容易得多。rm 命令配合正确的选项组合能够删除任意数量的文件和目录,无论目录是空的还是包含任意数量的文件和子目录。
首先,让我们测试 rm 命令来删除名为 my_file.txt 的文件:
$ rm my_files/my_file.txt
要使用 rm 命令删除目录,我们需要使用-r 选项组合。选项-r 代表递归,意味着该命令将删除任何目录以及其内容。以下命令将删除整个 my_files/dir1 目录,包括任何文件或子目录:
使用 rm 命令删除文件是不可逆的操作。这意味着,根据您使用的文件系统和系统用途,您的数据将无法恢复。在使用 rm Linux 命令时,请三思而后行。
$ rm -r my_files/dir1/
使用 rm 命令非常直接。与许多其他 Linux 命令一样,它接受多个参数,因此可以轻松删除单个或任意数量的文件和目录。
练习:执行单个 rm 命令,删除位于您的主目录中的整个 my_file 目录。
搜索文件或目录
到这一点,您应该对文件系统导航和文件/目录管理感到非常舒适。在我们转向下一个专门讨论基本 GNU/Linux 系统管理命令的部分之前,我们应该讨论一下如何在需要时查找文件。有两个主要的 Linux 命令允许用户搜索文件。即 locate 命令和 find 命令。
find 命令是一个强大的工具,因此对于初学者来说,使用起来可能有点令人不知所措。因此,我们只介绍 locate 命令,因为它更容易使用。
locate Linux 命令的基本用法非常简单。输入 locate,然后跟上文件或目录名称作为参数。例如,让我们搜索一个名为 issue 的文件:
$ locate issue
上述命令会生成一个包含字符串“issue”的文件或目录列表,该字符串可以出现在文件或目录名称的任何位置。根据您要搜索的内容,此列表可能会变得相当庞大。
因此,搜索精确的文件名匹配很可能会产生我们更愿意找到的输出。为此,我们需要使用正则表达式和 locate 命令的-r 选项。
正则表达式远远超出了本教程的范围。目前,我们只需要知道,要搜索精确的文件名或目录名,我们需要用 / 和 $ 将字符串括起来。例如:
$ locate -r /issue$
在您晋升为本地 Linux 命令大师之前,让我们简要讨论一下 locate 命令的运作方式。locate 命令在搜索时非常快速,因为它仅仅查询现有的预先构建的数据库索引文件,该文件每天使用 updatedb 命令更新一次。
缺点是 locate 命令不会捕捉到自上次执行 updatedb 命令以来创建的任何文件或目录。然而,为了包括任何新文件,用户可以选择手动运行 updatedb 命令,如下所示:
$ sudo updatedb
练习:尝试使用 locate Linux 命令,并看看是否可以找到一种方法,指示命令仅在特定目录中搜索文件。
基本管理 Linux 命令
以管理员权限执行命令
大多数您将运行的 Linux 命令将在没有管理员权限的情况下执行。事实上,仅在前方任务需要时才建议以管理员权限执行命令。遵循这个简单的规则将有助于整体系统完整性,并允许用户在与 Linux 命令行交互时避免昂贵和不必要的错误。
然而,很难想象完全避免以管理员权限执行 Linux 命令。安装新软件、配置核心系统服务等都需要管理员权限。这就是 sudo Linux 命令派上用场的地方。在任何 Linux 命令前加上 sudo 将确保以管理员权限(也称为 root 权限)执行该命令。自己试试吧:
$ sudo whoami $ whoami
默认情况下,给予 sudo 用户 5 分钟的时间,在第一次成功验证后,可以重复使用 sudo 命令输入特权命令而无需密码。
快速提示:每当您阅读任何要求您从终端运行 Linux 命令的 Linux 相关文档时,您会看到所有命令前面都带有$或#。$符号要求以普通非特权用户的身份执行任何给定的 Linux 命令。另一方面,#表示给定的 Linux 命令要么直接以 root 用户的身份执行,要么通过 sudo 命令使用 root/administrative 权限执行。
软件安装
GNU/Linux 系统的默认安装可以并且经常被定制以包含额外的软件,以满足您的需求。如果各种 GNU/Linux 发行版之间存在差异,那就是软件安装的方式。软件以软件包的形式提供,可从相关的发行版软件包存储库中获取。
在软件包管理方面,GNU/Linux 发行版有两个主要分支。
即它们是 DEB 和 RPM。第一个分支使用 apt,第二个分支使用 yum 命令来安装软件。当然,还有许多其他辅助命令可帮助软件安装或维护,但基础知识如下所述。
首先,我们开始搜索我们希望安装的软件的包名称。假设我们需要安装某种种子客户端,以便下载种子文件。首先,我们搜索包名称:
DEB GNU/LINUX SYSTEMS: $ apt search torrent client RPM GNU/LINUX SYSTEMS: $ yum search torrent client
上述命令将生成一个包名称列表及其相关描述。阅读描述栏,从左栏中选择您想要安装的包。一旦选择了要安装的包,请再次执行相关的包管理命令来安装该包。
假设我们希望安装的软件包名为 bittorrent。要开始安装,我们的命令必须以管理员权限执行,如前一节所述。提示时,输入 y 以执行安装:
DEB GNU/LINUX SYSTEMS: $ sudo apt install bittorrent RPM GNU/LINUX SYSTEMS: $ sudo yum install bittorrent
快速提示:执行 apt search 命令可能会生成一个包含许多软件包的长列表,这些软件包可能无法适应您的终端屏幕。为了克服这种不便,请将命令管道传输到 more,并使用空格键向下滚动列表。示例:
$ apt search YOUR SEARCH KEYWORDS | more
要退出并返回到命令行,请按下 q 键。
检查磁盘空间使用情况
在本节中,您将学习如何检查目录和文件大小,以及如何获取有关当前磁盘空间使用情况的信息。我们将在本节中介绍的第一个 Linux 命令是 df 命令。df 命令的名称是磁盘空闲的缩写。
通过在不带任何参数的情况下执行 df 命令,该命令将返回有关所有可访问分区的已用和可用磁盘空间信息,以千字节为单位。默认的 df 命令输出以千字节的形式打印磁盘使用信息。但是,可以通过使用-h 选项来覆盖此行为:
$ df -h
要检查任意所需目录的免费磁盘空间,只需将该目录的完整路径作为参数添加到 df 命令中即可。示例:
$ df -h /home
使用 df 命令检查目录的可用空间并不会显示有关其大小的信息。df 命令只会输出目录所在分区磁盘空间使用情况的信息。要检查目录大小,请使用下面解释的 du Linux 命令。
现在我们已经学会了如何检查可用磁盘空间,同样重要的是要知道如何获取有关文件和目录大小的信息。
要以人类可读的格式获取有关文件大小的信息,我们可以使用上面介绍的 ls 命令,结合-l(长列表)和-h(人类可读)选项,以及所讨论文件的完整或相对路径。例如,下面的 ls 命令将返回位于根目录/中名为 swapfile 的文件的大小:
$ ls -lh /swapfile
与检查文件大小相同,我们可以使用 du 命令来检查目录大小。默认情况下,当 du 命令提供目录参数时,将显示所有目录的大小:
$ du -h /home/
要获取单个目录的总大小摘要,请使用 -s 选项。再次强调,在本节中的所有示例中,我们对可读性输出感兴趣,因此使用 -h 选项:
$ du -sh /home/
练习:运行 man ls 命令,快速查看所有可能的 ls 命令选项。你能找到一种方法来使用 ls 命令按磁盘大小降序列出所有文件和目录吗?
文件和目录压缩
在本节中,我们将讨论在 GNU/Linux 系统上如何压缩和解压文件的几种方法。您将学习的第一个工具是 tar 和 gzip 命令。tar 命令主要用于将整个目录合并为单个文件,并在必要时可选择应用压缩。
以下 tar 命令示例将整个目录 my_dir 合并为一个名为 my_dir.tar 的单个文件:
$ tar cf my_dir.tar my_dir
为了进一步压缩生成的文件,我们可以使用 gzip 命令来生成一个名为 my_dir.tar.gz 的压缩文件:
$ gzip my_dir.tar
然而,大多数情况下我们仍然需要压缩目录,因此可以将 tar 和 gzip 工具结合起来压缩目录,作为上述命令的替代方案:
$ tar czf my_dir.tar.gz my_dir
通过 tar 和 gzip 命令组合生成的文件称为 gzip tarballs 或简称为 tarballs。
解压任何 tarball,我们可以简单地恢复过程,但是我们将使用 gunzip 命令而不是 gzip。例如,要解压缩 gzip tarball my_dir.tar.gz,我们可以使用 gunzip 命令:
$ gunzip my_dir.tar.gz
上述命令将生成我们的原始文件 my_dir.tar,其中包含 my_dir 目录。使用 tar 命令,我们可以进一步解压这个 tar 包以检索原始的 my_dir 目录:
$ tar xf my_dir.tar
关闭和重新启动
当涉及关闭和重新启动 GNU/Linux 操作系统时,您只需要学习一个命令,即既可以重新启动又可以关闭。这个命令直观地称为 shutdown。
是的,你可以使用例如 init 6 或 reboot 命令重新启动系统,但学习 shutdown 命令会给你更多的权力和选项。以下是一些 shutdown 命令的示例。
第一个关机命令示例将在一分钟后重新启动您的系统:
$ sudo shutdown -r
要立即重新启动您的 GNU/Linux 系统,请执行:
$ sudo shutdown -r now
使用关机命令关闭系统遵循与上述重启命令相同的原则。以下两个示例显示如何在一分钟内、立即和延迟 1.5 小时(90 分钟)关闭系统:
$ sudo shutdown $ sudo shutdown now $ sudo shutdown +90
如果您已执行了延迟系统关机,您可以通过以下方式取消关机过程:
$ sudo shutdown -c
高级 Linux 命令
故障排除互联网/网络连接
本节将向您介绍一些基本的网络技能。特别是,您将学习如何获取建立正确互联网连接所需服务的 IP 地址,以及如何排除网络连接和互联网连接的故障。
让我们通过使用 ip 命令来获取本地 IP 地址开始。ip 命令有许多选项,包括地址或一个用于显示分配给所有可用和启用的网络接口的 IP 地址的简短选项:
$ ip a
上述命令显示系统当前使用的 IP 地址。请注意,您的网络接口名称可能不同。在下一个示例中,我们将获取您网关的 IP 地址。再次使用 ip 命令,但这次加上 r(路由)选项:
$ ip r
下一个谜题的部分是 DNS(域名服务器)IP 地址。要检查系统正在使用哪个 DNS 服务器来将主机名解析为 IP 地址,只需使用之前解释过的 cat 命令检查 /etc/resolv.conf 文件的内容即可:
$ cat /etc/resolv.conf
现在,一旦我们获得了最基本的网络配置信息,我们就可以使用它来解决许多种网络连接问题,比如说,互联网连接。这项任务的最佳工具是 ping 命令。
使用 ping 命令,我们可以测试与任何 IP 地址或主机的连接。ping 命令将向任何所需的主机或 IP 地址发送一个数据包,并通知我们结果。默认情况下,ping 命令将向所选的 IP 地址或主机发送一个无限的 ping。要中断连续的 ping,请按下 CTRL+C 键组合。或者,使用-c 选项与指示您希望发送的数据包数量的数字组合。例如:
$ ping linuxconfig.org PING linuxconfig.org (104.24.11.18) 56(84) bytes of data. 64 bytes from 104.24.11.18 (104.24.11.18): icmp_seq=1 ttl=57 time=9.83 ms 64 bytes from 104.24.11.18 (104.24.11.18): icmp_seq=2 ttl=57 time=10.0 ms 64 bytes from 104.24.11.18 (104.24.11.18): icmp_seq=3 ttl=57 time=9.95 ms --- linuxconfig.org ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2002ms rtt min/avg/max/mdev = 9.833/9.933/10.008/0.073 ms $ ping -c 2 8.8.4.4 PING 8.8.4.4 (8.8.4.4) 56(84) bytes of data. 64 bytes from 8.8.4.4: icmp_seq=1 ttl=121 time=10.3 ms 64 bytes from 8.8.4.4: icmp_seq=2 ttl=121 time=10.4 ms --- 8.8.4.4 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 10.340/10.412/10.485/0.125 ms
如果您遇到任何互联网连接问题,您可以通过从本地 IP 地址或任何公共主机开始 ping 所有上述 IP 地址来排除网络连接问题。使用这种策略将有助于缩小导致网络连接问题的可能问题,如下所示。
更改权限和所有权
GNU/Linux 文件系统中的每个文件或目录都可以由不同的用户以及各种用户组拥有。此外,每个文件或目录都可以设置为符合一个或多个权限,如读取、写入和执行。关于文件或目录权限或所有权的主题可以涵盖一本小书。由于我们对基础知识感兴趣,以下是一些帮助您入门的提示。
让我们首先获取有关文件或目录权限的实际信息。为此,请使用已学习的 ls 命令执行-l 选项,并将文件或目录名称作为参数。例如:
$ ls -l dir/
输出的详细信息如下图所示。请花些时间消化这些信息,然后再继续前进:
如上图所示,有三种权限类型,分别是读取、写入和执行。以下表格列出了所有权限类型以及它们的符号和八进制表示:
权限类型 | 八进制表示 | 象征性表示 |
---|---|---|
阅读 | 4 | r |
写 | 2 | w |
执行 | 1 | x |
在 GNU/Linux 文件系统上更改文件或目录权限的工具是 chmod。使用 chmod 命令更改文件或目录权限有两种方式,即八进制或符号表示法。从这两种方式中,最好的方法是选择你觉得最容易记住和使用的那种。
以下示例显示如何使用 chmod 命令,同时使用八进制和符号表示法将 dir 目录权限更改为以下内容:
目标 | 要求 | 八进制表示 | 象征性表示 |
---|---|---|---|
用户(所有者) |
读、写和执行 |
7 如同(4 + 2 + 1) |
u=rwx |
组 | 阅读和写作 | 6 如同(4 + 2) |
g=rw |
其他 | 没有权限 | 0 | o= |
以下两个 chmod linux 命令使用八进制和符号权限表示法是可以互换的,并将根据上述要求更改 dir 目录的权限:
OCTAL: $ chmod 760 dir SYMBOLIC: $ chmod u=rwx,g=rw,o= dir
本节中要介绍的最后一个工具是 chown 命令。chown 命令允许用户更改文件或目录的所有权。每个文件或目录都有两种所有权类型。即用户和组所有权。
使用 chown 命令更改所有权是一个相当简单的过程。更改文件或目录所有权的通用规则是向 chown 命令提供两个参数。提供的第一个参数包含我们希望该文件或目录拥有的用户名和组名,用.分隔,第二个参数代表所涉及的文件或目录名称。
以下 chown Linux 命令示例将把名为 file.txt 的文件的所有权更改为用户 lubos 和属于组 linuxconfig 的所有用户:
$ chown lubos.linuxconfig file.txt
注意:要成功使用 chown Linux 命令更改文件或目录所有权,需要遵循以下两条规则。首先,用户和组必须存在;其次,从根用户或组更改所有权或更改为根用户或组都需要管理员权限。有关更多信息,请参阅上述 sudo 命令解释。
以下图片是本节讨论内容的简要总结:
练习:尝试使用 chmod Linux 命令的不同权限变化。您能解释一下将相同的权限集应用于文件或目录有何不同吗?
检查系统的内核版本
有时候您需要对您的 GNU/Linux 系统进行故障排除,因此您需要获取有关当前运行的内核(即 Linux)的信息。
使用 uname 命令结合-a 选项将输出关于您的内核版本和架构的详细信息:
$ uname -a
你知道吗:Linux 这个关键词实际上只是指系统的内核,而实际操作系统的命令是基于 GNU 自由软件二进制文件的,因此称整个操作系统为 GNU/Linux 或 Lignux 更为恰当和技术上更正确,而不是简单地称之为 Linux。
结论
这就是全部内容!但是,不要让本文的长度让你误以为没有其他东西可学习。相反,本文只是触及皮毛,旨在向读者介绍一些基本的 GNU/Linux 命令行技术。
请在下方提供反馈,帮助我改进这篇文章。如果您有任何进一步的问题或需要额外帮助,请访问 LinuxConfig 论坛。
你接下来应该学什么?好吧,继续尝试基础知识,并每天尝试添加新的 Linux 命令到你的技能库中。熟能生巧!
一旦您熟悉基本的 Linux 命令,考虑阅读我的面向初学者的 Bash 脚本教程,了解如何使用 Linux 命令结合 shell 脚本来自动化任务。