Linux 是一种开放源码 (open-source) 的类 UNIX 作业系统。虽然原先 Linux 只是由 Linus Torvalds 出于个人爱好而编写,但目前,Linux 已逐渐成为人们生活中不可或缺的一部分。从嵌入式设备到超级计算机,各处都有 Linux 的身影,在移动设备上广泛使用的 Android 系统正是建立在 Linux 内核之上。得益于其优雅的权限控制及优美的学习曲线,越来越多的服务器使用 Linux 以部署服务。
通常,我们安装使用的 Linux 是指经打包后的 Linux 发行版,其中包括 Debian(包括衍生版本 Ubuntu、Linux Mint)、Fedora(包括相关版本 Red Hat Enterprise Linux、CentOS)、openSUSE、Arch Linux(包括衍生版本 Manjaro)、Gentoo,不一而足。目前,Linux 发行版基本配备了各自的图形界面,使用与 Windows 系统相仿,容易入门。
但在一些服务器系统上,如 Ubuntu Server、CentOS 等,安装图形界面(GUI)导致系统正常运行的性能需求飙升,因此通常服务器仅安装命令行界面(CLI)。同时,即使在带有图形界面的 Linux 发行版,也 不是所有 的操作都能通过图形界面完成,命令行的学习有很大的 必要性。
本文希望使用 浅显易懂 的语言带读者入门 Linux。教程主要针对初学者在实际使用中 最常用 的内容展开,加入了作者自己的理解与认识,希望读者能在很短的时间内学会 Linux 的基本操作。如有更好的展开思路,欢迎各位朋友在评论区批评指正。
写在前面
本教程遵守署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议,您可以自由地共享、演绎,但需遵守署名、非商业使用、相同方式共享条件,并且保证没有附加限制。更详细的说明可参见关于页面。
教程中提到的部分内容可能因为更新而不再适用,请您自行检查位于文章尾部的教程最后更新时间加以判断。如果教程内有过时内容,欢迎在评论中指出,作者会 尽快 修改。
学习本教程的前提是有一台可以正常工作的 Linux 计算机。虽然安装 Linux 系统并不是一件困难的事情,但却是一件复杂的事情,Linux 的发行版数量众多,安装过程并不能很容易地归纳为几个简单的步骤,因此本教程 并不涉及 Linux 安装方面的内容。如果您手边不幸没有 Linux 电脑,可以考虑购置一台 Linux 云服务器,或自行在实体机或虚拟机上安装 Linux 系统,相关教程很多。如果您想要和作者安装一样的工作环境,可以参考作者的另一篇文章 我的 Linux 深度学习工作环境丨环境搭建教程 的前半部分,其介绍了 Ubuntu Server 22.04 LTS
的安装过程。
本教程中涉及的命令较多且很常用,推荐大家在阅读时能 实际运行一下 这些命令,查看它们的效果。对于较短的命令,建议初学者使用键盘输入以增强记忆;对于较长的命令,鼠标移入代码块后,右上角有 COPY
按钮,可以复制,粘贴后运行,查看结果。
样式说明
本教程正文部分以正常方式书写。
对于较为重要的附加说明或建议阅读的可选内容以 默认打开的折叠框展示。
这是一个默认打开的折叠框(点击可以折叠)
里面是较为重要的附加说明,建议阅读。
对于非重要的附加说明或引申内容以 默认关闭的折叠框展示。
这是一个默认关闭的折叠框(点击可以展开)
第〇章 什么是 Linux 命令
本章仅对 Linux 命令做一个初步的介绍,主要是给读者一个感性的认识,介绍一些命令的基本语法以及 Linux 自带的帮助文档如何查阅。如果读者暂时还不能连接上 Linux 终端,可以在大致浏览第〇章后,仔细阅读第一章的内容,确保连接上 Linux 终端后,再阅读第〇章的内容。第〇章的内容是 Linux 的 基础之基础,还请 务必仔细 阅读。
通常,第一次进入 Linux 命令行后,你可能会不知所措。因为你目力所及只有一个黑框框,里面有一些奇怪的英文字符,它通常是这样的:
|
其实,光标前面的这一串字符叫做 shell prompt
,中文可称为“命令行提示符”。默认状态下是 用户名@主机名
的格式,在上面例子中,用户名为 xiao
,主机名为 server
,后面跟的 ~
是命令行的当前目录,这将在后面介绍。美元符号($
)后面就是你的光标,你输入的字符将显示在后面。
试着输入 echo "Hello World"
然后回车,你会看到命令行输出了 Hello World
。
恭喜你运行了你的第一个 Linux 命令!
让我们乘胜追击,理解一下 Linux 命令的基本结构:
|
command
命令:表示命令的名称,例如ls
,chmod
,git
等等options
选项:表示命令的选项,中括号只是一个标记作用,表示这个选项是可选的,在实际书写时并不需要。通常,选项可以分为短选项与长选项。- 短选项:通常使用
-
引导,通常后面跟单个字符,例如-l
,-h
等。多个短选项可以直接组合,例如命令ls -l -h
可以直接表示为ls -lh
- 长选项:通常使用
--
引导,后面跟完整的单词,例如--human-readable
。例如上面的命令ls -lh
还可写成ls -l --human-readable
- 短选项:通常使用
arguments
参数:表示命令的作用对象,有些命令可能有多个参数,也可以没有参数
Linux 中命令、选项、参数之间使用空格来区分;
Linux 中命令严格区分大小写,对 Linux 而言 ls
与 LS
完全不同!
分析一下刚刚使用的命令 echo "Hello World"
的结构,echo
是这个命令(command)的名称,echo
有回声之意,所以其效果就是把参数字符串回显到命令行上;"Hello World"
就是命令的参数(arguments),在这里就是被回显的字符串。
如果要尝试一下选项(options)对命令的影响,试着输入 echo -n "Hello World"
,你大概会看到以下输出:
|
-n
选项的含义是不输出最后一个换行,所以你看到 Hello World
直接连在了 shell prompt
之后。
此后为了 方便起见,在代码说明时不再添加 shell prompt
,读者清楚即可。即不再使用:
|
转而使用:
|
折行
在 Linux 如果输入命令很长,可以使用反斜杠 (\
) 折行,使指令续行,例如:
|
其实等价于:
|
显然,使用反斜杠折行后,代码的可读性更好了一些。一般来说,为了终端的兼容性,一行不应超过 79 个字符,如果多于 79 个字符,需要考虑折行,当然,这个规则也适用于其他编程语言。
需要注意反斜杠后必须立刻接换行符,否则可能会产生转义字符而失去续行效果。
帮助命令
如果在 Linux 中突然遇到有些记得名字的命令的选项或参数遗忘,可以查看 Linux 自带的帮助。通常,帮助命令可以归纳为 whatis
, --help
, man
, info
。
whatis
命令
whatis
会显示命令简短的功能描述,命令语法:
|
例如:
|
--help
选项
在命令后加上 --help
通常可以显示使用方法和参数列表,有些时候,这个选项可以简写为 -h
,但要注意并不是所有命令都能如此简写,例如后面将要介绍的 ls -h
就是代表以人类可读的方式显示结果,这里 -h
是 --human-readable
的简写。因此,使用 --help
更具兼容性,命令语法:
|
例如:
|
就会显示 ls
命令的帮助。
man
命令
man
命令可以查看命令描述或帮助手册(man 是 manual 的简称,是帮助文档的意思),命令语法:
|
例如:
|
就会进入 echo
命令的帮助手册。按 q 键可以退出。
如果出现 No manual entry for command (点击可以折叠)
通常情况,Linux 发行版会自带帮助手册。但对于一些精简的系统,可能并未安装 man
,如果出现此提示,可以学习本教程第四章如何在 Linux 上安装软件,然后安装 man-pages
包及 man-db
包。
关于 section 参数(点击可以展开)
info
命令
info
命令可以查看比 man
更详细的说明,命令语法:
|
例如:
|
就会进入 echo
命令的说明,按 Q 键可以退出。
命令帮助的特殊符号 (点击可以折叠)
在查看命令帮助时,会出现 []
, <>
, 等符号,它们的含义如下:[]
表示是可选的;<>
表示是可变化的;xyz
表示只能选择一个;-abc
表示三个参数(或任何二个)的混合使用
查看历史命令
在 Linux 下,我们有时希望知道最近执行的命令,history
会帮上大忙:
|
在 Linux 下,我们有时还希望直接运行历史执行过的命令,!
会帮上大忙:
|
一些便利的功能与快捷键
在 Linux 命令行中,你可能想中断一些耗时很长的命令的运行,亦或者是修改一些命令,或者是快速调出上一次的命令,实际上,这些操作都有快捷键可以完成,当然 Linux 命令行中的快捷键众多,这里只列出常用的部分。如对其他快捷键有兴趣,可以自行查阅 man bash
快捷键 CTRL + A:将光标移到行首
快捷键 CTRL + C:停止正在运行的任务
快捷键 CTRL + L:清屏
快捷键 TAB:命令补全
快捷键 ↑:历史命令,可以不断向上翻阅
小结
至此,恭喜你完成了第〇章的学习!第〇章主要带读者了解了 Linux 命令的基本结构、 Linux 的一些帮助命令及一些好用的快捷键。有了这些前置知识后,现在,让我们正式开始学习 Linux 吧!
第一章 连接到 Linux 终端
要想熟练使用 Linux 终端,头等要事当然是打开 Linux 终端。但可能,这件事可能有些时候并没有想象中那么容易。
图形界面 Linux 发行版
如果你在计算机上安装了带图形界面的 Linux 发行版,通常当你进入桌面系统后,可以在所有程序中找到“终端”软件,然后打开。
如果你使用 GNOME 或 KDE 桌面,你通常可以使用快捷键 CTRL + ALT + T 打开终端。这里的 T 是 Terminal(终端)的首字母。
不带图形界面的 Linux 发行版
如果你使用了不带图形界面的 Linux 发行版,那么你启动计算机后,就会自动进入终端,你只需输入账户名及密码即可。
远程连接上 Linux 终端
如果你的服务器安装了 Linux,但你希望通过远程方式访问,那么通常会使用 ssh
(Secure SHell, 安全外壳协议) 命令连接到 Linux 服务器。这时,服务端与客户端都需要进行一些配置。虽然配置 ssh 服务端(简称 sshd)很明显超出了本章的内容,但好在,通常 Linux 服务器版本都自带 sshd 服务,因此本章中我们默认认为其是开启的。即服务端的配置是完美的。
如果你一定要检查 ssh 服务端是否开启 (点击可以展开)
下面就要进行客户端的配置了,其实这一部分并不复杂,如果你的个人电脑就是 Linux 系统或是 macOS 系统,那么默认是安装了 ssh 客户端的,这里并不需要多做配置;如果你是 Windows 电脑,并且是 Windows 8 或更高的系统,那么 ssh 客户端也已经安装;如果是 Windows XP 或 Windows 7,那么需要自行安装 OpenSSH 程序。由于安装程序较为简单,因此这一部分不再赘述。下面分系统介绍如何打开客户端电脑的终端(命令提示符)。
Linux, macOS 系统打开终端
如果使用 Linux 或 macOS 系统,可以打开系统内置的终端(在 macOS 上,这通常被称为终端模拟器)。
Windows 系统打开命令提示符
在 Windows 系统下,你要先打开命令提示符(cmd)或 PowerShell 才能输入命令。
打开命令提示符,你可以使用 Win + R 快捷键打开运行,在里面输入 cmd
后回车(或点击确定),即可打开命令提示符。当然也可以使用 Windows 搜索,搜索命令提示符或 PowerShell 后打开。
命令提示符界面
运行 ssh
命令
打开终端后,可以输入以下命令:
|
ssh 是命令的名称,username 是你想登录的远程账号的用户名,后面接 @
符号,然后紧跟远程主机的 IP 地址。如果你的服务器的 ssh 服务监听的端口不是 22 端口,那么可以使用 -p
选项指定端口,后面跟端口号即可。如果你不确定远程主机的 IP 地址,通常可以在远程主机上运行 ifconfig
命令查看,当然,对于初学者,往往直接询问网管或服务器相关人员更佳。
运行后,大概率会提示以下内容:
|
这是因为第一次连接到这个服务器,这个服务器的 IP 和对应的指纹还没有被客户端记录为可信的,所以弹出了一个警告,这时输入 yes
然后回车即可。当你同意后,你会发现提示了以下内容:
|
这个警告提醒你已经将这个 IP 和对应的指纹加入了信任的列表,以后将不再提示。
恭喜你已经连接上终端了!
不输入密码连接 ssh(点击可以折叠)
当你使用 ssh 连接服务器时,每次都要输入密码,如果密码简单还好,但通常,服务器密码为了安全,都有大小写字母、数字、特殊字符构成,每次登录都要输入未免太过麻烦,那么,有没有一种方法可以不输入密码连接 ssh 呢?
当然有!而且还使用广泛!并且还更加安全!那就是使用密钥的方式登录。
密钥形式登录的原理是:利用密钥生成器制作一对密钥 —— 一只公钥和一只私钥。将公钥添加到服务器的某个账户上,然后在客户端利用私钥即可完成认证并登录。这样一来,没有私钥,任何人都无法通过 ssh 暴力破解你的密码来远程登录到系统。此外,如果将公钥复制到其他账户甚至主机,利用私钥也可以登录。
下面来讲解如何制作密钥对,将公钥添加给账户,设置 ssh,最后通过客户端登录。
如果你的客户端使用的是 Windows 系统,那么作者这里建议你安装 Git for Windows,这会为后面的安装带来很多的便利。你可以点击上面的连接,下载最新的 64 位版本,然后安装。Git 其实是一个非常好用的版本控制工具,作者也会在后面的章节进行介绍。在安装完成后,可以在开始菜单找到刚刚安装的 Git,并且会生成几个快捷方式,双击打开 Git Bash。如果你使用的是 Linux 系统或 macOS系统,直接打开终端即可。
为了与后面的 github 更好地兼容,我们运行以下命令生成一对密钥:
ssh-keygen 使用个人邮箱生成密钥对
COPY
ssh-keygen -t rsa -b 4096 -C “your_email@example.com“
注意将 your_email@example.com
改为你的邮箱,如果你有 github 的账号,请改为你的 github 账号的注册邮箱。按回车后,会提示密钥的存储位置,这里保持默认即可。确认后,提示输入密钥的密码,通常情况下,这里可以留空,所以直接回车即可。按回车后,需要重复一遍密码,由于上次留空,这里再按一次回车即可。这样就生成好了公钥、私钥对。通常默认命名下,公钥是 id_rsa.pub
后缀是 public 的前三个字母,私钥是 id_rsa
无后缀。
私钥可以认为就是你的电脑的指纹,请务必妥善保存,否则别人就可以任意登录你的服务器,这是非常危险的!请注意,任何网站或服务器都不会索要你的私钥,因此请记住,私钥不上网!
第二步,就是在服务器上安装公钥。这一步只需运行命令:
使用 ssh-copy-id 将公钥安装到服务器
COPY
ssh-copy-id -i ~/.ssh/id_rsa.pub username@IP
需要注意,要将 -i
选项后的路径替换为你的 id_rsa.pub
的路径,username 为服务器端的用户名,IP 为服务器的地址。实际上 ssh-copy-id
命令就是将公钥写入服务器的 ~/.ssh/authorized_key
文件中,只不过帮我们自动完成了上传公钥、写入文件、修改权限的操作。
最后,测试一下是否可以无密码登入:
测试 ssh 免密登录
COPY
ssh username@IP
如果你没有输入密码就已经登录了终端,恭喜你完成了无密码登录。实际上这一生成的密钥对中的公钥可以用于多个服务器,如果想要免密登陆第二台服务器时,只需要运行第二步即可。
终端与 shell 的争论(点击可以展开)
终端的介绍
通常情况下,当你使用 Linux 终端时,默认使用的 shell 是 bash(Bourne-Again SHell),它是 sh 的后继兼容版本。对初学者而言,这个 shell 功能已经足够强大。但如果你还有其他追求,例如代码补全、自动目录跳转等等,在后续使用中也可以使用其他 shell,例如 zsh、fish 等。需要注意的是,不同的 shell 的语法有微妙的区别,有时一种 shell 的脚本并不能在另一种 shell 中运行。本教程默认使用 bash 教学。
我不想在命令提示符中敲命令
如果你使用的是 Windows 系统,那你大概会觉得命令提示符实在是太丑陋了,实际上,正常的 Linux 使用者也不会将命令提示符作为自己的主要工作环境。目前已经有相当多好用、易用的终端工具,例如 PuTTY、MobaXterm 等等,这些工具或多或少方便了 Linux 终端使用,有些还自带了文件传输的功能,推荐初学者尝试。作者的工作流主要使用 Windows Terminal + Visual Studio Code 两款软件。限于篇幅,作者将自用的 Linux 环境搭建以及一些终端的美化技巧放在了 我的 Linux 深度学习工作环境丨环境搭建教程 中,欢迎读者查看。
至此,恭喜你完成了第一章的学习!第一章主要带读者了解了如何连接到 Linux 终端。并且还讲解了一些关于免密登录终端的技巧及一些关于终端的小知识。后者仅是一些拓展,并不需要完全掌握。阅读完本章后,你只需要连接上一个可以正常运行 Linux 命令的终端即可,不论这是本地的终端,还是通过 ssh 远程连接的终端,并不会影响后续章节的学习。
第二章 了解 Linux 文件操作
了解了 Linux 命令的基本结构并且连接上终端之后,我们就要正式开始学习 Linux 命令了。但是在学习之前,还请允许作者介绍一下 Linux 的文件系统,不同于 Windows 系统,Linux 万物皆文件。正确理解 Linux 文件系统是后续学习 Linux 的基石。
Linux 文件系统
不同于 Windows 系统的盘符,Linux 系统只有一个根目录,不同的分区可以使用 挂载的方式 挂载到指定的挂载点上。Linux 所有的文件和目录都被组织成一个以根节点开始的树状结构。根目录使用 /
表示。当你在终端中输入:ls /
后会看到以下输出:
|
下面对其中的重要目录进行一些解释:
/bin
目录 bin 是 binaries (二进制文件) 的缩写,这个目录存放着最经常使用的命令。/boot
目录 这里存放的是 启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev
目录 dev 是 device (设备) 的缩写,该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。/etc
目录 etc 是 etcetera (等等) 的缩写,这个目录用来存放所有的系统管理所需要的 配置文件 和子目录。/home
目录 用户的 主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,例如,如果你的用户名是xiao
,那么你的主目录就是/home/xiao
。/lib
目录 lib 是 library (库) 的缩写,这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。/lost+found
目录 这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。/media
目录 Linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。/mnt
目录 mnt 是 mount (挂载) 的缩写,系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/
上,然后进入该目录就可以查看光驱里的内容了。/opt
目录 opt 是 optional (可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。/proc
目录 proc 是 processes (进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。/root
目录 该目录为系统管理员,也称作超级权限者的用户主目录。/sbin
目录 s 就是 super user 的意思,sbin 是 superuser binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。/srv
目录 src 是 service (服务) 的缩写,该目录存放一些服务启动之后需要提取的数据。/sys
目录 sys 是 system (系统) 的缩写,具体的内容这里并不介绍。/tmp
目录 tmp 是 temporary (临时) 的缩写,这个目录是用来存放一些临时文件的。/usr
目录 usr 是 unix shared resources (共享资源) 的缩写,注意不是 user 的缩写,这是一个 非常重要 的目录,用户的很多应用程序和文件都放在这个目录下,类似于 Windows 下的 Program Files 目录。/usr/bin
目录 系统用户使用的应用程序。/usr/sbin
目录 超级用户使用的比较高级的管理程序和系统守护程序。/usr/src
目录 src 是 source (源代码) 的缩写,该目录是内核源代码默认的放置目录。/var
目录 var 是 variable (变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。/run
目录 是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。
在实际使用过程中,系统管理员操作最多的当属 /etc
, /usr
, /root
目录,普通用户访问最多的是自己的用户目录,即 /home/username
目录。
在 Linux 文件系统中,还有几个特殊的目录,一个是用户所在的工作目录(working directory),也被称为当前目录,可以使用一个点 .
表示。还有一个是当前目录的上一级目录,也称为父目录,可以使用两个点 ..
表示。还有一个是用户的用户目录,也被称为家目录,可以使用一个波浪号 ~
表示,对普通用户来说,就是代表 /home/username
目录,对超级用户来说,就是代表 /root
目录。
另外,如果一个目录或文件名以一个点 .
开始,表示这个目录或文件是一个隐藏目录或文件 (如:.bashrc)。即以默认方式查找时,不显示该目录或文件。
注意,如果你的 Linux 系统还有 /swap
目录,这说明你的系统启用了交换分区,交换分区是可以使用硬盘的一部分空间当作内容使用,对于小内存的机器非常有用,如果你的机器有很大的内存,也 并不意味着 你可以不使用交换分区。Linux 系统会在交换分区中存储一些重要运行时,请 务必不要 将交换分区关闭。当然,目前已经不再推荐使用交换分区,因为分区后交换空间的大小难以更改,目前更推荐的是使用 swapfile(交换文件),即使用一个文件代替分区。
使用命令创建交换文件并启用 (点击可以展开)
Linux 的文件和目录严格区分大小写,./me/
和 ./Me/
是完全不同的两个目录,./me.py
与 ./Me.py
是完全不同的两个文件,这一点与 Windows 系统的默认行为大不相同,Windows 下目录和文件是不区分大小写的,这意味着同一文件夹下不可能同时出现 ./me.py
与 ./Me.py
文件,因为 Windows 认为这两个是同一个文件!请初学者务必注意其差别。
Linux 文件系统相关命令
在了解了 Linux 文件系统后,我们就可以正式开始 Linux 文件系统相关命令的学习了。Linux 中和文件操作相关的命令很多,这里只列举初学者最常用的一些命令,主要有 pwd
, cd
, ls
, cp
, mv
, touch
, rm
, mkdir
, rmdir
, cat
, head
, tail
, grep
, find
, zip
, tar
, nano
, vi
, ln
。
你很有可能会觉得这些命令都难以理解,但这是为了输入效率而做出的 妥协。因为毕竟所有命令都需要手动输入,如果命令本身能短一些,那么输入的效率就会高很多。实际上,这些命令大多是其功能的缩写,如果理解了,还是很好记忆的!
另外,由于 Linux 中万物皆文件,其实上 目录也是一种特殊的文件,后文我们在讲解命令语法时,不再区分文件路径和目录路径这两个名词,都统一使用 FILE
指代。
目录相关
pwd
pwd 可以显示当前工作目录,是 Print Working Directory 的缩写。cd
cd 可以更改当前的工作目录,是 Change Directory 的缩写。
|
ls
ls 可以查看目录或文件信息,是 list 的缩写。
|
复制、移动、创建、删除文件或目录
cp
cp 可以复制文件或目录,是 copy 的缩写。
|
mv
mv 可以移动或重命名文件,是 move 的缩写。
|
touch
touch 可以创建一个空白文件,如果当前目录有同样的文件,则会更新文件的修改时间
|
rm
rm 可以删除文件或文件夹,是 remove 的缩写。
|
rm
命令是一个非常危险的命令,不像 Windows 系统,Linux 系统没有回收站,因此删除后就无法找回。因此,一般的 shell 会将 rm
作为 rm -i
的别名,具体的别名方式会在第三章介绍,这里只需要知道在 bash 中,rm
其实是 rm -i
,而 -i
选项会在每次移除时提示你,并要求你做确认。
!!!如果不是特殊需求,慎用 -f
选项强制删除!!!
mkdir
mkdir 可以创建一个文件夹,是 make directory 的缩写,有的 shell 还可以进一步简写为md
。
|
rmdir
rmdir 可以删除一个空文件夹,是 remove directory 的缩写,有的 shell 可以进一步简写为rd
。
|
rmdir
一般用于删除空文件夹,如果文件夹中有文件,建议使用 rm
命令。
查看文件
cat
cat 命令可以查看文件的内容,是 concatenate 的缩写。cat
命令常和输入输出重定向运算共同使用,以完成拼接文件等操作。
|
head
head 命令可以打印文件的开头几行
|
tail
tail 命令可以打印文件的结尾几行
|
grep
grep 命令用于查找文件里符合条件的字符串,属于高级的 Linux 命令,这里仅作介绍,初学者用到的频率很少。find
find 命令用来在指定目录下查找文件,也是属于高级的 Linux 命令,这里仅作介绍,初学者用到的频率很少。
压缩与解压
在 Windows 上,我们经常会进行文件压缩、解压的操作,在 Linux 中,也有同样的操作。
zip
zip 是文件压缩命令,命令参数很多,这里只介绍常用的内容,如有需求,可以使用man zip
查看更多帮助。
|
tar
tar 可以创建文件归档包,在 Linux 中非常常用,是 tape archive 的缩写。tar 的命令参数很多,这里只介绍常用的内容,如有需求,可以使用man tar
查看更多帮助。
|
这里的选项较多,-c
表示 --create
即创建压缩文件;-z
表示 --gzip
即使用 gzip 压缩;-v
表示 --verbose
即显示命令的详细执行过程;-f
表示 --file
后面跟要创建的归档名,也就是压缩包名;-x
表示 --extract
即提取压缩文件。
当然,如果不使用 gzip 压缩,还可以使用以下的命令:
|
文本编辑器
在 Linux 上,我们常常会有文本编辑的需求,通常,我们使用 nano
或 vi
进行文本编辑。
nano
nano 是一个字符终端的文本编辑器,它比 vi、vim 要简单得多,比较适合 Linux 初学者使用。
|
nano 编辑器截图
进入 nano 编辑器后,你会在整个终端的下侧看见快捷键提示,使用其提示的快捷键即可完成文件编辑,保存的操作,其中,^X
表示 CTRL + X,M-U
表示 ALT + U,依此类推。
编辑完成后,使用 CTRL + O 写入所做的修改,这时 nano 会询问你写入文件的文件名,如果文件名不改变,直接回车即可,这样就可以保存文件,然后使用 CTRL + X 退出 nano。
vi
/vim
所有的 Unix Like 系统都会内置 vi 文书编辑器,其他的编辑器则不一定会存在。但是 vi 有一定的学习成本,目前使用更多的是vi
的改进版vim
。vim
具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。vim
的键盘图如下:
vim 键盘图
不要被这些花花绿绿的按键吓住,其实在实际使用中,常用的按键并不多,也很好记忆。如果你想学习 vim
的使用,可以在终端输入 vimtutor
,这时会有一个帮助教程教你使用 vim
。放心,这个教程非常简单!整个教程的时长大约 20 ~ 40 分钟,学习完成后,多使用几天 vim 就能熟练掌握,这会给编程效率带来很大的提升。如果你对作者使用的 vim
环境感兴趣,可以点击作者的另一篇文章 我的 Linux 深度学习工作环境丨环境搭建教程 查看。
由于 vim
非常常用,所以这里也大略介绍一下 vim
,旨在让初学者迅速了解如何编辑、保存一个文件,如果想进一步学习,最好还是跟随 vimtutor
学习。
vim 简要教程 (点击可以折叠)
基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。 这三种模式的作用分别是:
命令模式
用户刚刚启动 vi/vim,便进入了命令模式。此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下 i
,并不会输入一个字符,i
被当作了一个命令。
以下是常用的几个命令:
i
切换到输入模式,以输入字符。:
切换到底线命令模式,以在最底一行输入命令。x
删除当前光标所在处的字符.dd
删除当前光标所在行的所有字符。gg
将光标定位到文件的开头G
将光标定位到文件的结尾^
将光标定位到一行的开头$
将光标定位到一行的结尾
若想要编辑文本:启动 Vim,进入了命令模式,按下 i
,切换到输入模式。初学者常犯的错误就是在命令模式下输入字符,必须要切换到输入模式才能输入字符!
当然,命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。
输入模式
在命令模式下按下 i
就进入了输入模式。
在输入模式中,可以使用以下按键:
字符按键以及 Shift 组合键,输入字符;
回车键 Enter,换行;
退格键 Backspace,删除光标前一个字符;
删除键 Delete,删除光标后一个字符;
方向键,在文本中移动光标
退出 ESC,退出输入模式,切换到命令模式
底线命令模式
在命令模式下按下 :
(英文冒号)就进入了底线命令模式。底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。
在底线命令模式中,基本的命令有(已经省略了冒号):
q
退出程序w
保存文件wq
保存并退出q!
不保存,强制退出
文件链接 ln
命令
ln
是 Linux 的一个 非常重要 的命令,是 link files 的缩写,它的功能是为某一个文件在另外一个位置建立一个同步的链接。当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用 ln 命令链接(link)它就可以,不必重复的占用磁盘空间。
链接分为两种:硬链接 (hard link) 与软链接 (symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。通常,我们使用 软链接。
|
硬连接只能链接在同一文件系统下的文件,既不能跨文件系统,也不能链接目录,而软链接皆可链接。
随处可见的链接(点击可以折叠)
在 Linux 中,随处可见链接,例如使用 ls -lh /
,你可以看到以下输出:
ls -lh / 命令的输出
COPY
total 8.1G
lrwxrwxrwx 1 root root 7 Apr 21 00:57 bin -> usr/bin
drwxr-xr-x 4 root root 4.0K Jun 17 07:52 boot
drwxr-xr-x 20 root root 4.4K Jun 17 08:47 dev
drwxr-xr-x 125 root root 4.0K Jun 22 05:59 etc
drwxr-xr-x 3 root root 4.0K Jun 11 07:51 home
lrwxrwxrwx 1 root root 7 Apr 21 00:57 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Apr 21 00:57 lib32 -> usr/lib32
lrwxrwxrwx 1 root root 9 Apr 21 00:57 lib64 -> usr/lib64
lrwxrwxrwx 1 root root 10 Apr 21 00:57 libx32 -> usr/libx32
drwx—— 2 root root 16K Jun 11 07:41 lost+found
drwxr-xr-x 2 root root 4.0K Apr 21 00:57 media
drwxr-xr-x 2 root root 4.0K Apr 21 00:57 mnt
drwxr-xr-x 3 root root 4.0K Jun 11 09:09 opt
dr-xr-xr-x 713 root root 0 Jun 17 07:54 proc
drwx—— 6 root root 4.0K Jun 17 06:48 root
drwxr-xr-x 31 root root 1020 Aug 16 13:09 run
lrwxrwxrwx 1 root root 8 Apr 21 00:57 sbin -> usr/sbin
drwxr-xr-x 6 root root 4.0K Apr 21 01:02 snap
drwxr-xr-x 2 root root 4.0K Apr 21 00:57 srv
-rw——- 1 root root 8.0G Jun 11 07:42 swap.img
dr-xr-xr-x 13 root root 0 Jun 17 07:54 sys
drwxrwxrwt 21 root root 12K Aug 16 10:42 tmp
drwxr-xr-x 14 root root 4.0K Apr 21 00:57 usr
drwxr-xr-x 13 root root 4.0K Apr 21 01:01 var
在每行的开头,你会发现有一串奇怪的字符,其中第一个字符就是这个文件的属性,d
表示 directory
即目录,l
表示 link
即链接,-
表示普通文件。观察链接项,后面使用了 ->
符号表示了链接到的内容。说明在根目录下,其实 /bin
目录是 /usr/bin
的一个软链接。如果你运行 ls -lh /bin/
和 ls -lh /usr/bin/
,你会发现它们的输出一模一样!当然,如果你使用 ls -lh /bin
,ls
命令会告诉你这是一个链接。
使用链接,我们也可以像 Windows 一样创建快捷方式。
终端命令补充
以上介绍了 Linux 常用的文件处理命令,了解这些命令后,基本就可以很愉快地处理 Linux 上的文件了,也恭喜你有耐心看到这里,下面作者打算补充两个小知识点,可以让终端命令使用更加高效。
输入输出重定向
在 Linux 实际使用过程中,我们可能希望将一些命令打印的内容输出到文件,或是将一些命令的输入从文件中读取,shell 也提供了这样的方法,即使用输入输出重定向运算符 >
, >>
, <
。
|
其中,>
直接把内容生成到指定文件,会 覆盖 源文件中的内容,如果文件不存在会直接生成该文件;>>
则在文件尾部 追加,不会覆盖掉文件中原有的内容,如果文件不存在会直接生成该文件。
重定向深入讲解(点击可以展开)
在一行执行多条命令
很多情况下,我们需要在同一行输入多条命令,或是根据上一条命令的结果执行一些命令,这时可以使用 &&
, 完成命令的连接,用法如下:
|
其中,&&
是如果前一条命令执行成功则执行下一条命令,即如果 command1
执行成功,则执行 command2
; 与 &&
命令相反,执行不成功时执行后续命令,即如果 command1
执行失败,则执行 command2
。
例如我们可以使用
|
这样就可以先创建文件夹 a,如果文件夹创建成功,则进入文件夹 a。
还有一种不同寻常的命令连接方式,就是通过管道运算符 ,使用如下:
|
管道运算可以将前面进程的输出(stdout)直接作为下一个进程的输入(stdin),这在一些命令使用时非常便利。
|
其中 ps aux
是显示 Linux 的所有进程,然后使用管道传递到 grep
命令,表示查找其中的 bash
字符串,这样终端就会输出 bash
进程的信息。
至此,恭喜你完成了第二章的学习!第二章主要带读者了解了 Linux 文件系统及其对应的命令,学会后,就可以愉快地操作 Linux 系统的文件了,当然,在使用过程中,你可能会遇到你没有修改某个文件的权限,或是无法进入某个目录。下面,第三章将介绍 Linux 的用户与权限控制的相关内容,让你的普通用户也能在运行一些命令时提权为管理员用户!