第五期院系支持计划进行中|技术贴:Linux介绍与应用(上)
“
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 的基本操作。如有更好的展开思路,欢迎各位朋友在评论区批评指正。
目
录
第〇章 什么是 Linux 命令
第一章 连接到 Linux 终端
第二章 了解 Linux 文件操作
第〇章 什么是 Linux 命令
本章仅对 Linux 命令做一个初步的介绍,主要是给读者一个感性的认识,介绍一些命令的基本语法以及 Linux 自带的帮助文档如何查阅。如果读者暂时还不能连接上 Linux 终端,可以在大致浏览第〇章后,仔细阅读第一章的内容,确保连接上 Linux 终端后,再阅读第〇章的内容。第〇章的内容是 Linux 的 基础之基础,还请 务必仔细 阅读。
通常,第一次进入 Linux 命令行后,你可能会不知所措。因为你目力所及只有一个黑框框,里面有一些奇怪的英文字符,它通常是这样的:
你的命令行大概长这样COPY[xiao@server ~]$
其实,光标前面的这一串字符叫做 shell prompt
,中文可称为“命令行提示符”。默认状态下是 用户名@主机名
的格式,在上面例子中,用户名为 xiao
,主机名为 server
,后面跟的 ~
是命令行的当前目录,这将在后面介绍。美元符号($
)后面就是你的光标,你输入的字符将显示在后面。
试着输入 echo "Hello World"
然后回车,你会看到命令行输出了 Hello World
。
恭喜你运行了你的第一个 Linux 命令!
让我们乘胜追击,理解一下 Linux 命令的基本结构:
Linux 命令基本结构COPY[xiao@server ~]$ command [-options] [arguments]
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"
,你大概会看到以下输出:
echo 不换行示例COPY[xiao@server ~]$ echo -n "Hello World"
Hello World[xiao@server ~]$
-n
选项的含义是不输出最后一个换行,所以你看到 Hello World
直接连在了 shell prompt
之后。
此后为了 方便起见,在代码说明时不再添加 shell prompt
,读者清楚即可。即不再使用:
弃用的写法COPY[xiao@server ~]$ echo -n "Hello World"
转而使用:
后续 Linux 命令使用的写法COPYecho -n "Hello World"
折行
在 Linux 如果输入命令很长,可以使用反斜杠 (\
) 折行,使指令续行,例如:
折行示例COPYecho "Hello world. \
I think that Xiao Space is a fascinating website. \
What you think?"
其实等价于:
原始命令COPYecho "Hello world. I think that Xiao Space is a fascinating website. What you think?"
显然,使用反斜杠折行后,代码的可读性更好了一些。一般来说,为了终端的兼容性,一行不应超过 79 个字符,如果多于 79 个字符,需要考虑折行,当然,这个规则也适用于其他编程语言。
需要注意反斜杠后必须立刻接换行符,否则可能会产生转义字符而失去续行效果。
帮助命令
如果在 Linux 中突然遇到有些记得名字的命令的选项或参数遗忘,可以查看 Linux 自带的帮助。通常,帮助命令可以归纳为 whatis
, --help
, man
, info
。
whatis
命令
whatis
会显示命令简短的功能描述,命令语法:
whatis 命令语法COPYwhatis command
例如:
whatis 命令示例COPYwhatis echo
# output:
# echo (1) - display a line of text
--help
选项
在命令后加上 --help
通常可以显示使用方法和参数列表,有些时候,这个选项可以简写为 -h
,但要注意并不是所有命令都能如此简写,例如后面将要介绍的 ls -h
就是代表以人类可读的方式显示结果,这里 -h
是 --human-readable
的简写。因此,使用 --help
更具兼容性,命令语法:
--help 选项语法COPYcommand --help
例如:
--help 选项示例COPYls --help
就会显示 ls
命令的帮助。
man
命令
man
命令可以查看命令描述或帮助手册(man 是 manual 的简称,是帮助文档的意思),命令语法:
man 命令语法COPYman [section] command
例如:
man 命令示例COPYman echo
就会进入 echo
命令的帮助手册。按 q 键可以退出。
通常情况,Linux 发行版会自带帮助手册。但对于一些精简的系统,可能并未安装 man,如果出现此提示,可以学习本教程第四章如何在 Linux 上安装软件,然后安装 man-pages 包及 man-db 包。
info
命令
info
命令可以查看比 man
更详细的说明,命令语法:
info 命令语法COPYinfo command
例如:
info 命令示例COPYinfo echo
就会进入 echo
命令的说明,按 Q 键可以退出。
在查看命令帮助时,会出现 [], <>, | 等符号,它们的含义如下:
[] 表示是可选的;
<> 表示是可变化的;
x|y|z 表示只能选择一个;
-abc 表示三个参数(或任何二个)的混合使用
查看历史命令
在 Linux 下,我们有时希望知道最近执行的命令,history
会帮上大忙:
history 示例COPYhistory 5 # 显示最近使用的5个命令
history | more # 显示使用过的所有命令
在 Linux 下,我们有时还希望直接运行历史执行过的命令,!
会帮上大忙:
! 的用法COPY!5 # 执行历史编号为 5 的命令,注意感叹号与数字间没有空格
!ls # 执行最后一次以 ls 开头的命令
!! # 执行上一次命令
一些便利的功能与快捷键
在 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 服务,因此本章中我们默认认为其是开启的。即服务端的配置是完美的。
下面就要进行客户端的配置了,其实这一部分并不复杂,如果你的个人电脑就是 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 命令示例COPYssh username@IP [-p port]
# e.g.
ssh xiao@192.168.1.100
ssh xiao@192.168.1.100 -p 1000
ssh 是命令的名称,username 是你想登录的远程账号的用户名,后面接 @
符号,然后紧跟远程主机的 IP 地址。如果你的服务器的 ssh 服务监听的端口不是 22 端口,那么可以使用 -p
选项指定端口,后面跟端口号即可。如果你不确定远程主机的 IP 地址,通常可以在远程主机上运行 ifconfig
命令查看,当然,对于初学者,往往直接询问网管或服务器相关人员更佳。
运行后,大概率会提示以下内容:
ssh 第一次连接显示的警告COPYThe authenticity of host '192.168.1.100 (92.168.1.100)' cant be established.
ECDSA key fingerprint is SHA256:ZNfwzV12wqfsO0iYpIywNsBPYhta5TTaKBfzEl5TBos.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
这是因为第一次连接到这个服务器,这个服务器的 IP 和对应的指纹还没有被客户端记录为可信的,所以弹出了一个警告,这时输入 yes
然后回车即可。当你同意后,你会发现提示了以下内容:
永久添加指纹后显示的警告COPYWarning: Permanently added '192.168.1.100' (ECDSA) to the list of known hosts.
这个警告提醒你已经将这个 IP 和对应的指纹加入了信任的列表,以后将不再提示。
恭喜你已经连接上终端了!
当你使用 ssh 连接服务器时,每次都要输入密码,如果密码简单还好,但通常,服务器密码为了安全,都有大小写字母、数字、特殊字符构成,每次登录都要输入未免太过麻烦,那么,有没有一种方法可以不输入密码连接 ssh 呢?
当然有!而且还使用广泛!并且还更加安全!那就是使用密钥的方式登录。
密钥形式登录的原理是:利用密钥生成器制作一对密钥 —— 一只公钥和一只私钥。将公钥添加到服务器的某个账户上,然后在客户端利用私钥即可完成认证并登录。这样一来,没有私钥,任何人都无法通过 ssh 暴力破解你的密码来远程登录到系统。此外,如果将公钥复制到其他账户甚至主机,利用私钥也可以登录。
下面来讲解如何制作密钥对,将公钥添加给账户,设置 ssh,最后通过客户端登录。
如果你的客户端使用的是 Windows 系统,那么作者这里建议你安装 Git for Windows,这会为后面的安装带来很多的便利。你可以点击上面的连接,下载最新的 64 位版本,然后安装。Git 其实是一个非常好用的版本控制工具,作者也会在后面的章节进行介绍。在安装完成后,可以在开始菜单找到刚刚安装的 Git,并且会生成几个快捷方式,双击打开 Git Bash。如果你使用的是 Linux 系统或 macOS系统,直接打开终端即可。
终端的介绍
通常情况下,当你使用 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 /
后会看到以下输出:
ls / 命令的输出COPYbin boot dev etc home lib lib32 lib64 libx32 lost+found media
mnt opt proc root run sbin snap srv sys tmp usr var
下面对其中的重要目录进行一些解释:
/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 的缩写。
cd 命令示例COPYcd [FILE]
# e.g.
cd # 回到家目录
cd ~ # 回到家目录,与 cd 等价
cd .. # 进入上级目录
cd / # 进入根目录
ls
ls 可以查看目录或文件信息,是 list 的缩写。
ls 命令示例COPYls [OPTION]... [FILE]...
# e.g.
ls # 列出当前目录下的文件
ls / # 列出根目录下的文件
ls -a # -a (--all) 列出当前目录下的所有文件,含隐藏文件
ls -l # 这里的 -l 是 long 的意思,列出当前目录下文件的详细信息,包含权限、
# 修改信息等
ls -lh # -h (--human-readable) 使用人类可读的方式列出,空间占用会使用 K、G 等单位
复制、移动、创建、删除文件或目录
cp
cp 可以复制文件或目录,是 copy 的缩写。
cp 命令示例COPYcp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
# e.g.
cp a.txt b.txt # 复制 a.txt 并另存为 b.txt
cp a.txt ../ # 复制 a.txt 到父目录
cp -r ./a ../ # -r (--recursive) 可以递归复制文件夹,这个命令是将文件夹 a 及其所有
# 内容复制到父目录
mv
mv 可以移动或重命名文件,是 move 的缩写。
mv 命令示例COPYmv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...
# e.g.
mv a.txt b.txt # 将 a.txt 重命名为 b.txt
mv a.txt ../ # 移动 a.txt 到父目录
mv ./a ../ # 移动文件夹 a 到父目录,注意 mv 可以直接移动文件夹所有内容,不需要
# 加上递归选项
touch
touch 可以创建一个空白文件,如果当前目录有同样的文件,则会更新文件的修改时间
touch 命令示例COPYtouch [OPTION]... FILE...
# e.g.
touch a.txt # 在当前目录下创建 a.txt
rm
rm 可以删除文件或文件夹,是 remove 的缩写。
rm 命令示例COPYrm [OPTION]... [FILE]...
# e.g.
rm ./a.txt # 删除文件 a.txt
rm -r ./a # -r (--recursive) 递归删除文件夹 a
rm -f [FILE] # -f (--force) 强制删除
rm
命令是一个非常危险的命令,不像 Windows 系统,Linux 系统没有回收站,因此删除后就无法找回。因此,一般的 shell 会将 rm
作为 rm -i
的别名,具体的别名方式会在第三章介绍,这里只需要知道在 bash 中,rm
其实是 rm -i
,而 -i
选项会在每次移除时提示你,并要求你做确认。
!!!如果不是特殊需求,慎用 -f
选项强制删除!!!
mkdir
mkdir 可以创建一个文件夹,是 make directory 的缩写,有的 shell 还可以进一步简写为md
。
mkdir 命令示例COPYmkdir [OPTION]... DIRECTORY...
# e.g.
mkdir a # 在当前目录下新建 a 文件夹
mkdir -p ./a/b # -p (--parents) 递归地创建文件夹,如果 a 不存在,则会先创建 a
# 文件夹,再在 a 下创建 b 文件夹
# 等价于 mkdir ./a ./a/b
mkdir -v ./a # -v (--verbose) 显示创建文件夹的详细信息
rmdir
rmdir 可以删除一个空文件夹,是 remove directory 的缩写,有的 shell 可以进一步简写为rd
。
rmdir 命令示例COPYrmdir [OPTION]... DIRECTORY...
# e.g.
rmdir a # 删除当前目录下的空文件夹 a
rmdir -p ./a/b # -p (--parents) 递归地删除文件夹
# 等价于 rmkdir ./a/b ./a
rmdir
一般用于删除空文件夹,如果文件夹中有文件,建议使用 rm
命令。
查看文件
cat
cat 命令可以查看文件的内容,是 concatenate 的缩写。cat
命令常和输入输出重定向运算共同使用,以完成拼接文件等操作。
cat 命令示例COPYcat [OPTION]... [FILE]...
# e.g.
cat a.txt # 在终端上打印 a.txt 中的内容
cat > a.txt # 创建 a.txt 文件,并且接受终端输入,按 Ctrl + C 停止输入并保存
# 这里第一次出现了重定向运算符,不理解没有关系,这将在后面介绍
# 使用 <<eof 可以输入大段文字,结束输入时使用 eof 即可,eof 不会出现在文件中< span="">
# 这种语法被称为 heredoc,初学者只需了解即可
cat > a.txt <<eof
Hello world.
I think that Xiao Space is a fascinating website.
What you think?
EOF
head
head 命令可以打印文件的开头几行
head 命令示例COPYhead [OPTION]... [FILE]...
# e.g.
head a.txt # 打印 a.txt 的开头 10 行
head -n 5 a.txt # -n (--lines=) 打印 a.txt 的开头 5 行
head -n -5 a.txt # 从 a.txt 的开头打印到倒数第 5 行,不含倒数第五行
tail
tail 命令可以打印文件的结尾几行
tail 命令示例COPYtail [OPTION]... [FILE]...
# e.g.
tail a.txt # 打印 a.txt 的结尾 10 行
tail -n 5 a.txt # -n (--lines=) 打印 a.txt 的结尾 5 行
tail -n -5 a.txt # 从 a.txt 的开头第 5 行打印到文件结尾,不含第五行
grep
grep 命令用于查找文件里符合条件的字符串,属于高级的 Linux 命令,这里仅作介绍,初学者用到的频率很少。find
find 命令用来在指定目录下查找文件,也是属于高级的 Linux 命令,这里仅作介绍,初学者用到的频率很少。
压缩与解压
在 Windows 上,我们经常会进行文件压缩、解压的操作,在 Linux 中,也有同样的操作。
zip
zip 是文件压缩命令,命令参数很多,这里只介绍常用的内容,如有需求,可以使用man zip
查看更多帮助。
zip 命令示例COPYzip -r test.zip ./test # 压缩 test 文件夹生成 test.zip
unzip test.zip # 解压 test.zip
tar
tar 可以创建文件归档包,在 Linux 中非常常用,是 tape archive 的缩写。tar 的命令参数很多,这里只介绍常用的内容,如有需求,可以使用man tar
查看更多帮助。
tar 命令示例COPYtar -czvf test.tar.gz ./test # 压缩 test 文件夹生成 test.tar.gz
tar -xzvf test.tar.gz # 解压 test.tar.gz
这里的选项较多,-c
表示 --create
即创建压缩文件;-z
表示 --gzip
即使用 gzip 压缩;-v
表示 --verbose
即显示命令的详细执行过程;-f
表示 --file
后面跟要创建的归档名,也就是压缩包名;-x
表示 --extract
即提取压缩文件。
当然,如果不使用 gzip 压缩,还可以使用以下的命令:
tar 命令示例,不使用 gzipCOPYtar -cvf test.tar ./test # 压缩 test 文件夹生成 test.tar
tar -xvf test.tar # 解压 test.tar
文本编辑器
在 Linux 上,我们常常会有文本编辑的需求,通常,我们使用 nano
或 vi
进行文本编辑。
nano
nano 是一个字符终端的文本编辑器,它比 vi、vim 要简单得多,比较适合 Linux 初学者使用。
nano 使用COPYnano test.txt # 编辑 test.txt
nano -w test.txt # 关闭 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
的使用,可以在终端输入 vimtutor
,这时会有一个帮助教程教你使用 vim
。放心,这个教程非常简单!整个教程的时长大约 20 ~ 40 分钟,学习完成后,多使用几天 vim 就能熟练掌握,这会给编程效率带来很大的提升。如果你对作者使用的 vim
环境感兴趣,可以点击作者的另一篇文章 我的 Linux 深度学习工作环境丨环境搭建教程 查看。
由于 vim
非常常用,所以这里也大略介绍一下 vim
,旨在让初学者迅速了解如何编辑、保存一个文件,如果想进一步学习,最好还是跟随 vimtutor
学习。
文件链接ln命令
ln是 Linux 的一个 非常重要 的命令,是 link files 的缩写,它的功能是为某一个文件在另外一个位置建立一个同步的链接。当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用 ln 命令链接(link)它就可以,不必重复的占用磁盘空间。
链接分为两种:硬链接 (hard link) 与软链接 (symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。通常,我们使用 软链接。
ln 命令示例COPYln [OPTION]... [-T] TARGET LINK_NAME
ln [OPTION]... TARGET
ln [OPTION]... TARGET... DIRECTORY
ln [OPTION]... -t DIRECTORY TARGET...
# e.g.
ln a.txt b.txt # 给文件创建硬连接,b.txt 和 a.txt 的各项属性均相同
ln -s a.txt b.txt # -s (--symbolic) 给文件创建软链接,b.txt 相当于 a.txt 的
# 快捷方式
ln -s -f a.txt b.txt # -f (--force) 如果 b.txt 存在,也强制链接到 a.txt
硬连接只能链接在同一文件系统下的文件,既不能跨文件系统,也不能链接目录,而软链接皆可链接。
终端命令补充
以上介绍了 Linux 常用的文件处理命令,了解这些命令后,基本就可以很愉快地处理 Linux 上的文件了,也恭喜你有耐心看到这里,下面作者打算补充两个小知识点,可以让终端命令使用更加高效。
输入输出重定向
在 Linux 实际使用过程中,我们可能希望将一些命令打印的内容输出到文件,或是将一些命令的输入从文件中读取,shell 也提供了这样的方法,即使用输入输出重定向运算符 >
, >>
, <
。
输出重定向示例COPYecho "Hello World" > hello.txt
echo "Hello World" >> hello.txt
其中,>
直接把内容生成到指定文件,会 覆盖 源文件中的内容,如果文件不存在会直接生成该文件;>>
则在文件尾部 追加,不会覆盖掉文件中原有的内容,如果文件不存在会直接生成该文件。
在一行执行多条命令
很多情况下,我们需要在同一行输入多条命令,或是根据上一条命令的结果执行一些命令,这时可以使用 &&
, ||
完成命令的连接,用法如下:
&&, || 使用示例COPYcommand1 && command2
command1 || command2
其中,&&
是如果前一条命令执行成功则执行下一条命令,即如果 command1
执行成功,则执行 command2
;||
与 &&
命令相反,执行不成功时执行后续命令,即如果 command1
执行失败,则执行 command2
。
例如我们可以使用
&& 举例COPYmkdir a && cd a
这样就可以先创建文件夹 a,如果文件夹创建成功,则进入文件夹 a。
还有一种不同寻常的命令连接方式,就是通过管道运算符 |
,使用如下:
管道运算示例COPYcommand1 | command2
管道运算可以将前面进程的输出(stdout)直接作为下一个进程的输入(stdin),这在一些命令使用时非常便利。
管道使用示例COPYps aux | grep bash
其中 ps aux
是显示 Linux 的所有进程,然后使用管道传递到 grep
命令,表示查找其中的 bash
字符串,这样终端就会输出 bash
进程的信息。
至此,恭喜你完成了第二章的学习!第二章主要带读者了解了 Linux 文件系统及其对应的命令,学会后,就可以愉快地操作 Linux 系统的文件了,当然,在使用过程中,你可能会遇到你没有修改某个文件的权限,或是无法进入某个目录。下面,第三章将介绍 Linux 的用户与权限控制的相关内容,让你的普通用户也能在运行一些命令时提权为管理员用户!
2018年4月,清华大学学生学习与发展指导中心设立“院系学生学习与发展指导支持计划”(下简称“院系支持计划”),旨在支持院系解决大类培养政策下学生实际遇到的学习发展困惑,促进校系两级全覆盖学业支持系统。
院系支持计划已开展5期,累计支持91个项目,在促进学风建设、提升学习能力、学业预警干预等方面均取得丰硕成果。
供稿 | 土木工程系暨建筑管理系学生科协技术服务部
编辑 | 钟玉晨
审核 | 徐璠璠