Linux命令
您是 GNU/Linux 的初学者,并且希望超越通常的窗口拖动和鼠标单击的范围吗?本指南面向希望学习 GNU/Linux 命令行基础知识的绝对初学者用户。本教程旨在介绍与导航、文件和目录管理、软件安装以及基本系统故障排除相关的基本 Linux 命令。
在本教程中您将学习:
如何使用Linux命令
什么是 GNU/Linux 命令行
每当您听到有人谈论 GNU/Linux 操作系统时,您很可能也会听到他们谈论命令行或 Linux 命令。运行这个命令并执行这个和那个命令!正确的?
然而,为什么呢?为什么GNU/Linux操作系统几乎总是和命令、命令行联系在一起呢?简单的答案是,命令行是 GNU/Linux 操作系统的一个组成部分,因此它为用户提供了更有效、更精确地执行任务的可能性,最重要的是,还提供有关整个执行过程的附加洞察信息。
让我们对自己诚实吧!无论你有什么借口厌恶 GNU/Linux 系统及其命令行,原因很可能与缺乏理解和不愿学习有关。
因此,我们不要把我们的缺点归咎于GNU/Linux系统!无论您是初学者还是高级用户,它都可以为您提供帮助。该系统可以在多大程度上帮助您并不取决于您的钱包深度,因为其他一些专有操作系统就是这种情况!您从 GNU/Linux 系统获得的帮助量完全取决于您的学习意愿和决心。
在这个阶段,我确信您要问自己的问题是:我需要学习 GNU/Linux 命令行和无数命令才能使用 GNU/Linux 操作系统吗?答案是否定的!任何安装了 GUI 的不错的 GNU/Linux 操作系统都不需要用户使用命令行来执行基本甚至高级任务。
您可能考虑学习 GNU/Linux 命令行的唯一原因是为了提高您的效率以充分利用系统,并且如果前面的任务需要您这样做的话。请记住,许多 GNU/Linux 用户多年来甚至不知道命令行是什么!不了解 Linux 命令行完全没问题,如果系统可以满足您的需要,则无需学习甚至最基本的命令。
无论您使用什么风格的 GNU/Linux 操作系统,无论它是否有图形用户界面,命令行总是以某种形式出现。
Ubuntu Linux 操作系统上的命令行终端窗口
因此,如果您了解命令行基础知识,那么无论使用什么系统,您仍然会感到宾至如归。命令行通过使用各种命令,允许您在没有 GUI 的任何 GNU/Linux 系统上管理系统并执行最复杂的任务,以及远程跨越长距离,似乎让您感觉自己正坐在其中电脑前面。
然而,要做到这一点,人们至少需要对 GNU/Linux 命令行有基本的了解,并了解它提供的一些命令的一些基本用法。不要害怕,因为这正是您将通过阅读此 Linux 命令教程学到的内容。
什么是 Linux 命令
Linux命令是整个GNU/Linux操作系统的精华,用来管理整个系统。您可能不知道,您在图形用户界面中运行的大多数应用程序都在后台为您执行 Linux 命令来完成给定的任务。
让应用程序自动为我们运行 Linux 命令有很多明显的好处。然而,缺点是在许多情况下我们无法自定义命令执行以使其达到所需的结果。此外,如果出现问题,用户很可能会被蒙在鼓里,没有任何关于如何开始解决问题的提示。
现在您可能会想:好吧,这很好,但是有多少个命令,我应该学习所有这些命令吗?您的 GNU/Linux 系统上可用的 Linux 命令数量与数量无关。不同的系统总是不同的。但是,如果您坚持要求确切的数字,请在终端中执行以下命令:
$ for i in ${PATH//:/ }; do ls $i; done | sort | uniq | wc -l
我的 Ubuntu 桌面 Linux 安装上正好有 2024 命令可用。
您的系统上可用的命令数量会有所不同。最重要的是,GNU/Linux 操作系统平均可能包含数千个命令,这最终也回答了我们的下一个问题,即用户是否需要学习所有这些命令。好吧,你可以尝试一下,但这个任务注定会失败。
因此,最好的方法是从基础开始;绝对必须学习 Linux 命令来帮助您浏览 GNU/Linux 文件系统并执行基本的管理任务。一旦您完成了这项任务并对 Linux 命令行充满了信心,剩下的事情就会自然而然地通过使用 GNU/Linux 系统来轻松完成。您所需要的只是开放的心态和决心。
好吧,废话已经说够了,让我们开始吧!
基本文件系统和导航 Linux 命令
命令行参数、选项和参数
如果您希望完全理解 GNU/Linux 命令行,那么了解 Linux 命令行参数、选项和参数之间的区别可能是最关键的部分。因此,不要跳过本主题,而是在继续下一部分之前确保您彻底理解它。
解释 Linux 命令行参数、选项和参数之间差异的最佳工具是 ls 命令。如果您还不知道 ls 命令,请不要担心,因为稍后的部分将详细介绍该命令。打开终端并运行以下命令。不要输入 $
符号,因为该符号仅用于通知您这是要在命令行上执行的命令,并且要以常规非特权用户身份执行:
$ ls
键入上述命令并按 ENTER 键后,该命令会列出当前目录中的所有文件和目录。现在,忽略该命令的输出,并注意该命令由一个参数组成,即命令 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
文件。
在命令行上提供所有参数的顺序取决于您正在执行的 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 文件系统想象成一座多层建筑。由 /
表示的所谓根目录(建筑物的入口门)提供了整个文件系统(建筑物)的入口,因此可以访问所有目录(层/房间)和文件(人)。
要导航到第 3 层的房间 1,我们首先需要进入主门 /
,然后前往第 3 层 level3/
,并从那里进入 room1
。因此,到建筑物内这个特定房间的绝对路径是/level3/room1
。从这里开始,如果我们希望也访问 level3 上的 room2,我们首先需要通过输入 ../
离开当前位置 room1,然后输入房间的名称 room2
。我们采用了 room2 的相对路径,在本例中为 ../room2
。我们已经在第 3 层,因此无需离开整个建筑并通过主入口 /level3/room2
采取绝对路径。 令人困惑?不要担心,在使用 GNU/Linux 命令行几次之后,知识就会融入并成为您的第二天性。
不管你相信与否,GNU/Linux 操作系统为所有用户提供了一个指南针,以 pwd
(print working d目录)命令。每次你迷路时,只需输入pwd
命令,它就会向你显示路径。现在就试试。打开终端并输入 pwd
,然后按 ENTER:
$ pwd
pwd
命令示例打印当前工作目录路径。
默认情况下,您的起始工作目录始终是您的主目录。每个非系统用户的目录都位于 /home
目录中。如上图所示,用户linuxconfig
的主目录的绝对路径是/home/linuxconfig
。如果您的系统包含用户“john”,则该用户主目录的绝对路径为 /home/john
。
快速提示:对任何用户主目录的访问权限仅适用于拥有该目录的实际用户以及在 GNU/Linux 中为 root< 的管理员。 /代码> 用户。
在这个阶段,我们应该知道如何在命令行上输入命令,并且我们还知道如何获取文件系统中的当前位置。是时候开始四处走动了。为此,我们使用 cd
(change ddirectory) 命令。 cd 命令允许用户在具有适当访问权限的情况下导航到文件系统上的任何可用目录。
通过执行以下命令来尝试,不要害怕尝试。不要忘记您的个人指南针,即 pwd
命令,它可以立即告诉您当前的位置。请确保将以下 linuxconfig
用户替换为您自己的用户名:
$ cd /home
$ cd linuxconfig
$ cd /
$ cd home/linuxconfig
$ cd ../linuxconfig
$ cd ../../etc
$ cd /home/linuxconfig
除了 第 5 行 和 第 6 行 之外,上述命令应为不言自明的。在第5行上,我们使用快捷方式../
向上移动到linuxconfig<的父目录/代码> 目录。在第 6 行上,我们向上移动了两个目录,并最终导航到 etc
目录。
练习:执行不带任何参数的 cd
命令,即可从任何位置立即导航到用户主目录。执行 cd -
在您最近访问的两个位置之间切换。执行 cd ~ 和 cd 后,您最终会进入哪个目录。 命令?
使用 cd
命令进行 Linux 命令行导航。
练习:你能区分绝对路径和相对路径吗?看看上图,您能数一下在使用 cd 命令导航文件系统时我们使用了多少次绝对路径和相对路径吗?提示:绝对路径始终以 /
开头 性格。
对于任何初学者来说,遍历 GNU/Linux 文件系统并理解绝对路径和相对路径之间的区别并不是一个容易的话题。在继续之前,请确保您熟悉 cd
Linux 命令和目录之间的导航,因为这些知识将在接下来的部分中为您提供很好的帮助。
列出目录内容
此时,您应该熟悉使用 cd 命令进行文件系统导航,并且您还对 GNU/Linux 命令行(包括命令行参数、选项和参数)有基本的了解。到目前为止,我们已经学会了如何导航到任何目录,但还没有学会如何列出目录内容。列出目录内容是本节的主要主题。
用于列出任何目录内容的工具是 ls 命令。现在就试试。打开终端并在主目录中单独输入 ls
命令,无需任何选项或参数:
$ ls
颜色突出显示与常规 ls 命令输出。
通过执行不带任何选项或参数的 ls 命令,该命令会列出当前工作目录的内容。许多现代终端通过将目录着色为蓝色、将常规文件着色为白色以及将可执行文件着色为绿色来为用户提供附加信息。请注意,您在许多终端上都找不到这种奢侈的功能,因此,我们需要学习如何使用 ls 命令手动区分各种类型的目录内容项。
快速提示:大多数命令都附带一个手册页,可用于了解其功能以及每个特定命令接受的参数。使用 man
命令显示任何所需命令的手册页。例如,要显示 ls
命令的手册页,请执行 man ls
。要退出手册页,请按q
键。
正如我们在前面的部分中已经了解到的,可以使用其预编程选项来修改命令的输出。在这种情况下,-l
选项(也称为长列表)会向默认 ls
输出添加更多信息:
$ ls -l
ls
命令长列表选项 -l
提供有关每个目录项的附加信息。突出显示的是每个目录项的文件类型信息,其中 d
表示目录类型,-
表示常规文件。
通过使用 -l
选项,ls
命令为用户提供额外信息,例如权限、用户或组所有权、文件大小和修改时间。
另一个常见的 ls 命令选项是 -a ,它列出目录中的所有文件或目录以及隐藏的文件或目录。名称以 .
为前缀的任何文件或目录都会被隐藏,因此不会包含在默认 ls
命令输出中。
$ ls -a
ls 命令的许多选项只有与其他一些选项结合使用才有意义。例如,要显示任何选定文件的文件大小,用户可以提供带有 -l
选项的 ls
命令,并使用相关的实际文件名作为参数。请考虑以下 ls 命令示例来显示 image.jpg 文件的大小:
$ ls -l image.jpg
使用 ls
Linux 命令显示文件大小。
默认情况下,ls
命令显示文件大小(以字节为单位),除非提供了-h
(人类可读)选项。请注意,除非与 -l
选项一起提供,否则 -h
选项没有任何意义。
此时,需要注意的是,通过使用参数,用户可以列出任何目录或查找整个文件系统上任何文件的信息,而无需离开其主目录。为此,只需提供您希望列出更多信息的文件或目录的绝对或相对路径作为的参数 ls 命令。尝试以下 ls 命令示例:
$ ls /etc/systemd
$ ls -l ../
$ ls -lh /etc/services
使用 ls 命令的绝对或相对路径参数的示例。
练习:使用ls
命令的手册页,看看是否可以找到一种方法来显示/etc
目录的内容根据文件大小降序排列。
创建目录
目录的目的是保持文件系统,从而组织我们的文件和系统文件。在本节中,您将了解如何在 GNU/Linux 命令行上使用 mkdir
命令创建目录。
在 GNU/Linux 系统上创建目录就像执行 mkdir 命令一样简单,同时将所需的直接名称作为参数指定。现在就试试。打开终端并创建一个名为的新目录,例如dir1
在您的主目录中。
$ mkdir dir1
快速提示:避免创建名称中包含空格的文件和目录。在 Linux 中,可以通过用引号将名称括起来来创建其中包含空格的目录或文件名,例如mkdir“我的文件”
,但这可能会在以后产生问题,所以不惜一切代价避免它!如果需要在文件或目录名称中使用空格,请使用下划线 _
代替。
接下来,使用 ls 命令列出当前工作目录的内容,如果该目录创建正确,您应该在命令输出中看到它。
与在当前工作目录中创建目录相同,您还可以在文件系统上的任何位置创建目录,前提是您拥有适当的权限。现在让我们在 /tmp
目录中创建一个名为 example
的新目录。
现在有两种方法可以完成这项任务。首先,我们可以使用 cd
命令导航到 /tmp
,进入目录后执行 mkdir
命令,后跟新目录名称。
另一种解决方案是通过仅在新目录名称前添加要创建新 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
在 GNU/Linux 命令行上使用 mkdir
命令创建目录。
练习:使用您的用户帐户,尝试在 /etc
目录中创建一个名为 my_dir
的目录。有效吗?如果没有,为什么?
创建文件并读取文件内容
GNU/Linux 系统以纯 ASCII 文本文件的形式存储有关设置、配置以及日志等数据的大部分信息。因此,任何用户都必须至少对文本文件操作有基本的了解。
在本节中,您将学习如何创建文件、读取文件内容以及如何使用基于简单命令行的文本文件编辑器来编辑文本文件。
首先,我们在主目录中创建一个名为 file1
的空文件。为此,我们使用 touch
命令。打开终端并输入以下 Linux 命令:
$ touch file1
就这些!您现在已在主目录中成功创建了一个名为 file1
的新文件。现在执行 ls 命令,您应该会看到这个新文件位于您的主目录中。
使用 GNU/Linux 命令 touch
创建文件。
也许您可能已经注意到,我们创建了一个没有扩展名的文件,例如 .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
,然后按 ENTER
键保存文件。此时,新的 todo-list.txt
文件已创建。要退出 nano
编辑器,请按 CTRL+x
组合键,如下图所示:
打开 nano
编辑器。输入所需的文件名作为参数。
通过输入所需的文本来编辑文件内容。准备好后,按 CTRL+o
组合键保存当前文件内容。
确认文件名并按ENTER
键。
继续编辑并重复前两个步骤,或者按 CTRL+x
组合键退出 nano
编辑器。
名为 todo-list.txt
的新文件现已创建,并且在执行 ls
命令时应该可见。
您可以通过将文件名指定为 nano
文本编辑器命令的参数来继续编辑任何现有文本文件。
到目前为止,我们学习了如何创建文件以及如何使用命令行文本编辑器编辑现有或新的文本文件。我们还没有讨论如何读取文本文件的内容。好吧,老实说,没有什么太多的!您可以使用 cat
GNU/Linux 命令读取任何文件的内容。
现在就试试。执行cat
命令并提供您要检查的文件的名称作为参数。例如:
$ cat todo-list.txt
使用cat
命令显示任何文本文件的内容。只需将文件名作为 cat
命令参数提供即可。
练习:某些文件可能跨越数千行。尝试使用 cat
命令查找 /etc/services
文件的内容。有些终端的行数有限并且没有滚动条。因此,仅使用 cat
命令无法读取大型文本文件的内容。尝试使用 less
或 more
等命令来读取 /etc/services
文件的内容。
在我们将此部分标记为“完成并除尘”之前,您还应该熟悉另一个命令。该命令称为file
。
请记住,之前我们讨论过文件名不必带有扩展名。那么如果是这种情况,我们如何知道我们的主目录或 GNU/Linux 文件系统上的任何位置存储了什么类型的文件呢?这就是 file
命令派上用场的地方。 file
命令输出作为参数提供给它的任何文件的文件类型。现在就试试:
$ file todo-list.txt
使用file
GNU/Linux 命令获取文件类型信息。
重命名或移动文件和目录
另一个合乎逻辑的步骤是学习如何重命名或移动文件和目录。至此,我们已经讨论了如何创建文件或目录,但是如何将现有目录或文件移动到另一个位置呢?好吧,您应该很高兴知道在 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 下移动和重命名文件或目录的工作示例。
复制文件和目录
在上一节中,我们讨论了如何使用 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 命令示例将 file1
复制到目录 /tmp
:
$ cp file1 /tmp/file1
但是,如果您无意更改文件名,则根本不需要提供文件名作为目标参数。因此,上述命令可以缩写为:
$ cp file1 /tmp/
练习:通过执行单个 cp
命令,将 /etc/services
文件复制到您的主目录并将其重命名为端口号.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 命令的实际操作,如本节所述:
cp
GNU/Linux 命令示例,使用 GNU/Linux 命令行终端复制 GNU/Linux 文件系统上的目录和文件。
删除文件和目录
在此阶段,您应该对 Linux 命令行基础知识非常有信心。您可能还注意到使用命令的模式。您应该知道如何创建、移动和重命名任何文件或目录。但是,如果不知道如何删除文件或目录,您的文件系统就会填满,因此将失去存储更多数据的能力。
本节将介绍两个命令。第一个命令是 rmdir,第二个命令是 rm。当查看 rmdir 和 rm 命令的名称时,您可能很快就会得出结论:命令 rmdir 用于删除目录,而后一个命令则用于删除目录。 rm
用于删除文件,在大多数情况下你是对的。我们首先看一下 rmdir 命令。
对于我们的实验,我们将使用以下包含多个子目录和文件的目录结构。我们的目标是学习如何使用 rmdir 和 rm 命令删除所有文件和目录:
练习目录结构,了解如何使用 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 命令一样,它接受多个参数,因此可以轻松删除单个或任意数量的文件和目录。
使用 GNU/Linux 命令 rm 和 rmdir 删除文件和目录。
练习:执行单个 rm
命令来删除位于主目录中的整个 my_file
目录。
搜索文件或目录
此时,您应该对文件系统导航和文件/目录管理非常熟悉。在我们进入下一节专门讨论基本的 GNU/Linux 系统管理命令之前,我们应该讨论如何在出现这种需要时查找文件。有两个主要的 Linux 命令允许用户搜索文件。即,它是locate
命令和find
命令。
find 命令是一个功能强大的工具,因此使用起来可能有点困难,尤其是对于初学者来说。因此,我们介绍 locate
命令只是因为它更容易使用。
locate
Linux 命令的基本用法非常简单。键入 locate
,后跟文件或目录名称作为参数。例如,让我们搜索一个名为 issue
的文件:
$ locate issue
上面的命令生成整个文件系统中的文件或目录列表,其中文件或目录名中的任何位置都包含字符串 issue
。根据您要搜索的内容,此列表可能会增长到相当大的规模。
因此,搜索精确的文件名匹配可能会产生我们更倾向于找到合适的输出。为此,我们需要使用正则表达式和locate
的命令行选项-r
。
正则表达式远远超出了本教程的范围。现在,我们只需要知道,要搜索确切的文件名或目录名,我们需要用 /
和 $
包围字符串。例如:
$ locate -r /issue$
使用GNU/Linux命令locate来搜索文件和目录
在将自己提升为 locate
Linux 命令大师之前,我们先简单讨论一下 locate
命令的操作方式。 locate
命令的搜索速度非常快,因为它仅查询使用 updatedb
命令每天更新一次的现有预构建数据库索引文件。
缺点是 locate
命令不会拾取自上次执行 updatedb
命令以来创建的任何文件或目录。但是,要包含任何新文件,用户可以选择手动运行 updatedb
命令,如下所示:
$ sudo updatedb
updatedb
命令使用示例。
练习:尝试使用 locate
Linux 命令,看看是否可以找到一种方法来指示该命令仅在特定目录中搜索文件。
基本管理 Linux 命令
使用管理权限执行命令
您将运行的大多数 Linux 命令都将在没有管理权限的情况下执行。事实上,仅在前面的任务需要时才建议使用管理权限执行命令。遵循这个简单的规则将有助于整体系统的完整性,并允许用户在与 Linux 命令行交互时避免代价高昂且不必要的错误。
然而,很难想象完全避免使用管理权限执行Linux命令。新软件安装、核心系统服务配置等都需要管理权限。这就是 sudo
Linux 命令派上用场的地方。在任何 Linux 命令前加上 sudo 前缀将确保该命令以管理权限(即 root 权限)执行。自己尝试一下:
$ sudo whoami
$ whoami
whoami 命令始终返回执行该命令的用户的用户名。在本例中,我们可以看到,在 whoami
Linux 命令前加上 sudo
命令可以确保 whoami
命令以 root 用户身份执行。
默认情况下,sudo
用户在首次身份验证成功后,有 5 分钟的时间可以在没有密码的情况下重复使用 sudo
命令输入特权命令。
快速提示:每当您阅读任何要求您从终端运行 Linux 命令的 Linux 相关文档时,您都会看到所有以 $
或<代码>#。 $
符号要求以常规非特权用户身份执行任何给定的 Linux 命令。另一方面,#
表示给定的 Linux 命令要以 root/管理权限执行,可以直接作为 root 用户执行,也可以使用 sudo
命令执行。
软件安装
您的 GNU/Linux 系统的默认安装可以并且经常被定制,以包含其他软件来满足您的需求。如果说不同的 GNU/Linux 发行版之间存在差异的话,那就是软件的安装方式不同。该软件以相关分发包存储库中提供的包的形式提供。
在软件包管理方面,GNU/Linux 发行版有两个主要分支。
即,它们是DEB 和RPM。第一个分支使用 apt ,第二个分支使用 yum 命令来安装软件。当然,还有许多其他辅助命令可以帮助软件安装或维护,但下面介绍了基本知识。
首先,我们开始搜索我们想要安装的软件的包名称。假设我们需要安装某种 torrent 客户端,以便我们能够下载 torrent 文件。首先,我们搜索包名:
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
命令行软件包管理工具在Ubuntu Linux系统上安装软件。
执行apt search
命令可能会产生一长串软件包,这些软件包可能不适合您的终端屏幕。为了克服这种不便,请将命令传递给 more
并使用空格键向下滚动列表。示例:
要退出并返回命令行,请按q
键。
$ apt search YOUR SEARCH KEYWORDS | more
检查磁盘空间使用情况
在本节中,您将了解如何检查目录和文件大小以及如何获取有关当前磁盘空间使用情况的信息。我们将在本节中介绍的第一个 Linux 命令是 df 命令。命令名称 df
是单词 disk free 的缩写。
通过执行不带任何参数的 df 命令,该命令将返回有关所有可访问分区的已用和可用磁盘空间的信息(以千字节为单位)。默认 df 命令输出以千字节为单位打印磁盘使用信息。但是,可以使用 -h
选项覆盖此行为:
$ df -h
要检查任何所需目录的可用磁盘空间,只需将该目录的完整路径添加为 df 命令的参数即可。例子:
$ df -h /home
使用 /home
目录中的 df
命令检查可用磁盘空间。
注意
使用 df 命令检查目录可用空间不会显示有关其大小的任何信息。 df命令仅输出目录所在分区磁盘空间使用情况的信息。要检查目录大小,请使用 du
Linux 命令,如下所述。
现在我们已经了解了如何检查可用磁盘空间,了解如何检索有关文件和目录大小的信息也很重要。
要以人类可读的格式获取有关文件大小的信息,我们可以使用上面介绍的 ls
命令以及 -l
(长列表)和 的组合>-h
(人类可读)选项以及相关文件的完整或相对路径。例如,以下 ls
命令将返回位于根目录 /
中名为 swapfile
的文件的大小:
$ ls -lh /swapfile
与检查文件大小相同,我们可以使用 du 命令来检查目录大小。默认情况下,du
命令在提供目录参数时将显示其中所有目录的大小:
$ du -h /home/
要获取单个目录的总大小摘要,请使用 -s
选项。再次,正如本节上述所有示例一样,我们对人类可读的输出感兴趣,因此使用 -h
选项:
$ du -sh /home/
使用 du
Linux 命令检查 /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
目录的原始文件 my_dir.tar
。使用 tar
命令,我们可以进一步解压此 tarball 以检索原始 my_dir
目录:
$ tar xf my_dir.tar
使用 tar
、gzip
和 gunzip
Linux 命令进行文件和目录压缩和解压缩的示例。
关闭并重新启动
当涉及到关闭和重新启动 GNU/Linux 操作系统时,您只需要学习一个命令,即可执行重新启动和关闭的操作。该命令直观地称为shutdown
。
是的,您确实可以使用 init 6
或 reboot
命令重新启动系统,但学习 shutdown
命令可以为您提供更多功能和选项。下面是shutdown
命令的几个示例。
第一个 shutdown
命令示例将在一分钟内重新启动您的系统:
$ sudo shutdown -r
要立即重新启动 GNU/Linux 系统,请执行:
$ sudo shutdown -r now
使用 shutdown
命令关闭系统遵循与上述重新启动命令所示相同的原则。以下两个示例显示如何在一分钟内立即关闭系统并延迟 1.5 小时(90 分钟):
$ sudo shutdown
$ sudo shutdown now
$ sudo shutdown +90
如果您执行了延迟系统关闭,您可以通过以下方式取消关闭过程:
$ sudo shutdown -c
高级 Linux 命令
互联网/网络连接故障排除
本节将向您介绍一些基本的网络技能。特别是,您将了解如何获取建立正确的 Internet 连接所需的服务的 IP 地址,以及如何排除网络连接和 Internet 连接的故障。
让我们开始使用 ip
命令获取本地 IP 地址。 ip
命令有许多选项,其中包括 address
或简称 a
选项,用于显示分配给所有可用且启用的网络的 IP 地址接口:
$ ip a
上述命令显示系统当前使用的IP地址。请注意,您的网络接口名称可能不同。在下一个示例中,我们获取您网关的 IP 地址。我们再次使用 ip
命令,但这次使用 r
(route) 选项:
$ ip r
下一个难题是 DNS(域名服务器)IP 地址。要检查您的系统使用哪个 DNS 服务器将主机名解析为 IP 地址,只需使用 cat
命令检查 /etc/resolv.conf
文件的内容,如前所述:
$ cat /etc/resolv.conf
Linux命令获取基本的网络配置信息。
现在,一旦我们获得了最基本的网络配置信息,我们就可以使用它来解决多种网络连接问题,例如互联网连接。执行此任务的最佳工具是 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
如果您遇到任何 Internet 连接问题,您可以通过从本地 IP 地址或任何公共主机开始 ping 所有上述 IP 地址来排除网络连接故障。使用此策略将帮助您缩小导致网络连接问题的可能问题范围,如下所示。
使用 ping
Linux 命令排除 Internet 连接故障。
更改权限和所有权
GNU/Linux 文件系统中的每个文件或目录都可以由不同的用户以及不同的用户组拥有。此外,每个文件或目录都可以设置为符合一种或多种权限,例如读、写和执行。有关文件或目录权限或所有权的主题可以涵盖一本小书。由于我们对基础知识感兴趣,因此这里有一些帮助您入门的提示。
让我们首先获取有关文件或目录权限的实际信息。为此,请执行已学习的 ls
命令,并使用 -l
选项和文件或目录名称作为参数。例如:
$ ls -l dir/
有关输出的详细信息如下图所示。在继续之前,请花一些时间消化信息:
通过 ls
命令及其 -l
长列表选项检索详细的文件或目录信息。
如上图所示,权限类型有读、写和执行三种。下表列出了所有权限类型及其符号和八进制表示形式:
Permission Type | Octal Representation | Symbolic Representation |
---|---|---|
Read | 4 | r |
Write | 2 | w |
Execute | 1 | x |
更改 GNU/Linux 文件系统上的文件或目录权限的工具是 chmod。使用 chmod 命令更改文件或目录权限有两种方法,即通过八进制或符号表示。从这两种方法中,最好的方法是您认为最容易记住和使用的方法。
以下示例演示如何使用带有八进制和符号表示形式的 chmod 命令将 dir 目录权限更改为以下内容:
Target | Requirement | Octal Representation | Symbolic Representation |
---|---|---|---|
User ( owner ) | Read, Write and Execute | 7 as in (4 + 2 + 1) | u=rwx |
Group | Read and Write | 6 as in (4 + 2) | g=rw |
Others | No permissions | 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
以及属于该组的所有用户所拥有Linux配置:
$ chown lubos.linuxconfig file.txt
注意:要使用 chown
Linux 命令成功更改文件或目录所有权,请应用以下两条规则。首先,用户和组必须存在,其次,将所有权更改为 root
用户或组需要管理权限。有关更多信息,请参阅上面的 sudo 命令说明。
下图是本节所讨论内容的快速摘要:
chmod
和 chown
Linux 命令示例用法。
练习:试验 chmod
Linux 命令的不同权限变体。您能否解释一下对文件或目录应用相同的权限集有何不同?
检查系统内核版本
有时您需要对 GNU/Linux 机器进行故障排除,因此您需要获取有关当前运行的内核(即 Linux)的信息。
将 uname
命令与 -a
组合使用将输出有关内核版本和体系结构的详细信息:
$ uname -a
你知道吗:Linux关键字实际上仅指系统的内核,而实际操作系统的命令是基于GNU > 自由软件二进制文件,因此将整个操作系统称为 GNU/Linux 或 Lignux 更合适,技术上也更正确,而不是简单地称为 Linux.
结论
就这些了!但是,不要因为本文的篇幅而欺骗您,认为没有其他东西可学。相反,本文仅仅触及表面,因为目的只是向读者介绍一些基本的 GNU/Linux 命令行技术。
请在下面提供反馈,以帮助我改进本文。如果您还有任何其他问题或需要其他帮助,请访问 LinuxConfig 论坛。
接下来你应该学习什么?好吧,继续尝试基础知识,并尝试每天向您的指令添加新的 Linux 命令。熟能生巧!
一旦您熟悉了基本的 Linux 命令,请考虑我为初学者编写的 Bash 脚本教程,了解如何使用 Linux 命令结合 shell 脚本来自动执行任务。