终端
模式:
真正的终端:没有图形界面,只有黑底白字的全屏幕的终端,只能通过键盘输入,也可以称为Console(控制台)。
图形模式的终端:一般我们在Ubuntu,Fedora等Linux发行版下日常使用的就是这种终端。你可以配置终端的外观,用鼠标操作,也可以同时运行其他应用程序,等等。
当打开终端,第一行所见的就叫命令行提示符。我的是这样的:
oscar@oscar-laptop:~$
命令行提示符,顾名思义就是提示在其后面输入命令。在你输入新的一行命令前,这个命令提示符都会出现。分别解析一下上边代表什么意思:
oscar
这是当前用户的名字。Linux是一个多用户的操作系统,Windows也可以。不过Linux的多用户管理更方便。我们一般建议每个使用Linux系统的用户都创建一个属于自己的账户,便于隐私管理。
@
这个符号我们应该不陌生,我们的电子邮件一般都是 [email protected] 这样的不是吗。这个@就表示英语里的at,是“在...里面,落户在...的,在其中”的意思。@前面是用户名,后面是所在的域。
oscar-laptop
这是当前电脑/操作系统的名字。上面说了在@后面的是一个域,所以 oscar@oscar-laptop 就表示oscar-laptop这台电脑的oscar这个用户。oscar-laptop这个名称在安装此Linux系统时可以任意指定。
:
这是分隔符,没有什么特别的涵义。
~
这是当前所在目录的名字,会随着用户进入不同目录而改变。~表示当前用户的家目录,有点类似Windows系统的“我的文档”这个目录。
$
指示你所具有的权限的字符。在Linux系统中有两种可能:
-
$
:表示普通用户,有权限的限制(比如不能修改重要的系统文件等)。因此我的账户oscar就是一个普通用户。 -
#
:表示超级用户,也就是root。表示你当前以root这个用户出现。root拥有所有权限,是系统的大管家,想干什么就干什么。
因此, oscar@oscar-laptop:~$
的意思就是:
你目前是以oscar这个用户登录;你的电脑名称为oscar-laptop;你目前位于 ~ 目录下,就是你的用户家目录。你是普通用户,拥有有限的权限。
命令的参数
参数里可以包含多个参数,由空格隔开,也可以包含数字,字母,等等。可以说,参数没有固定的格式,但是一般来说还是遵循一定的规范的。
- 短参数(一个字母)
最常用的参数形式就是一个短横线后接一个字母。例如:
command -p
如果我们要一次加好几个短参数,可以用空格隔开,例如:
command -p -a -T -c
多个短参数也可以合并在一起,例如上面的命令等价于:
command -paTc
请注意:参数的字母的大小写是有区别的,大写的T和小写的t通常表示不同意思。
- 长参数(多个字母)
长参数没有短参数那么常用,但也是很有用的。短参数是以一个短横线开始,而长参数是以两个短横线开始的。例如:
command --parameter
如果有多个长参数,是不能像多个短参数那样合并写的。而是只能以空格隔开,例如:
command --parameter1 --parameter2
当然我们也可以组合使用短参数和长参数,例如:
command -paTc --parameter1 --parameter2
有时候,同一个意义的参数有短参数和长参数两种形式,效果是一样的,可以任选哪一种。
参数的值
有一些参数你还需要给它赋一个值才行。而且短参数和长参数的赋值的方式不尽相同。
例如,短参数赋值,通常是这样的:
command -p 10
表示把10赋值给p参数。
如果是长参数,则一般是这样赋值:
command --parameter=10
长参数的方式更加容易理解,但是不如短参数那么简洁。
其他参数
正如我们说过的,参数的形式没有绝对的准则。我们上面给出的规则是一般的,有些命令的参数格式可能是我们没怎么见过的。
有些参数就不一样,而且取决于命令。例如对于 ls 这个命令,假如后面带了一个参数,这个参数是一个目录的路径名的话,那么就会列出此目录下的文件。
ls linux_c/
文件和目录
两种类型的文件
简单起见,我们把Linux下的文件分为两大类:
普通的文件:这是我们已经熟知的文件类型,这样的文件包括:文本类型的文件(.txt,.doc,.odt,等等),声音文件(.wav,.mp3,.ogg),还有程序,等。简单来说,这些文件在Windows下也有。
特殊的文件:其他一些文件是特殊的,因为它们表示一些东西。例如,你的光盘驱动器就是这类特殊的文件。Windows把电脑里的东西区分为文件和非文件,但Linux不是这样。对于Linux来说,一切都是文件!
根目录
在一个文件系统中,我们总有一个被称为根目录的东西,这个根目录里包含了所有其他目录和文件。Linux中有且只有一个根目录,就是
/
是的,就是用一个斜杠表示。没有比根目录再高一阶的目录了,因为没有目录包含根目录,根目录就是Linux最顶层的目录。
根目录的直属子目录
bin:是英语binary的缩写,表示“二进制文件”(我们知道可执行文件是二进制的)。包含了会被所有用户使用的可执行程序。
boot:英语boot表示“启动”。包含与Linux启动密切相关的文件。
dev:是英语device的缩写,表示“设备”。包含外设。我们之后会仔细研究这个目录,因为它里面的子目录,每一个对应一个外设。比如代表我们的光盘驱动器的文件就会出现在这个目录下面。
etc:etc有点不能顾名思义了。因为etc是法语et cetera的缩写,翻成英语就是and so on,表示“等等”。包含系统的配置文件。至于为什么在/etc下面存放配置文件, 按照原始的UNIX的说法(Linux文件结构参考UNIX的教学实现MINIX) ,这下面放的都是一堆零零碎碎的东西, 就叫etc好了。这其实是个历史遗留。
home:英语home表示“家”。用户的私人目录。之前我们提过一些,在这个目录中,我们放置私人的文件,有点类似Windows中的Documents这个文件夹,也叫“我的文档”。Linux中的每个用户(除了大管家用户,也就是超级用户root外,root因为太厉害,拥有所有权限,所以比较“任性”,跟普通用户不住在一起)都在home目录下有自己的一个私人目录。比如我的用户名是oscar,那么我的私人目录就是/home/oscar;如果另一个用户叫jean,那么他的私人目录就是/home/jean。
lib:是英语library的缩写,表示“库”。包含被程序所调用的库文件,例如.so结尾的文件,在Windows下这样的库文件是以.dll结尾的。
media:英语media表示“媒体”。当一个可移动的外设(比如USB盘,SD卡,DVD,光盘等等)插入电脑时,Linux就可以让我们通过media的子目录来访问这些外设中的内容。
mnt:是英语mount的缩写,表示“挂载”。有点类似media,但一般用于临时挂载一些装置。
opt:是英语optional application software package的缩写,表示“可选的应用软件包”。用于安装多数第三方软件和插件。
root:是英语“根”的意思。超级用户root的家目录/主目录。一般的用户的家目录是位于/home下,不过root用户是个例外。之前的课程我们也提到过,root是整个系统的超级用户,拥有一切权限。
sbin:是英语system binary的缩写,表示“系统二进制文件”。比起bin目录多了一个前缀system,所以包含的是系统级的重要可执行程序。
srv:是英语service的缩写,表示“服务”。包含一些网络服务启动之后所需要取用的数据。
tmp:是英语temporary的缩写,表示“临时的”。普通用户和程序存放临时文件的地方。
usr:是英语Unix Software Resource的缩写,表示“Unix操作系统软件资源”(也是个历史遗留的命名)。这个目录是最庞大的目录之一。有点类似Windows中的C:\Windows和C:\Program Files这两个文件夹的集合。在这里面安装了大部分用户要调用的程序。
var:是英语variable的缩写,表示“动态的,可变的”。通常包含程序的数据,比如一些log(日志)文件,记录电脑中发生了什么事。
pwd 和 which
Linux系统安装后,包含了很多的文件和目录(虽然其实都是文件),我们很容易迷失在“茫茫文海”中。
当然我们不可能一下子列出Linux中的所有文件,那不现实。但是我们可以向你展示如何在Linux的目录树中来回穿梭,你可以知道此刻你位于哪个目录下。就好比能看懂Linux这个很大的“地图”。
pwd 是英语Print Working Directory的缩写,表示“打印当前工作目录”。
which 命令:获取命令的可执行文件的位置,which命令用于显示一个命令的对应的可执行程序的位置。可能听起来有点拗口。
在Linux下,每一条命令其实对应了一个可执行程序。我们在终端中输入命令,再按回车的时候,其实就是执行了对应的那个程序。比如说,pwd命令对应的pwd程序就是存在于Linux中的。
一个命令,其实只不过是一个我们随时可以调用的程序罢了。
which命令接受一个参数,也就是你想要知道其可执行程序位于哪里的那个命令。
我们来测试一下,就拿pwd命令来测试好了:
which pwd
得到:
/bin/pwd
因此,pwd命令对应的pwd这个可执行程序位于/bin目录中。
我们也可以注意到Linux中的可执行程序和Windows中不太一样,在Windows中可执行程序一般以.exe结尾,而Linux中一般是没有后缀名的。
Linux中的可执行程序也不是都位于相同目录的。我们可以来测试一下which命令本身对应的可执行程序位于哪里:
which which
我们可以看到,which命令对应的可执行程序which并不位于/bin中,而是在/usr/bin中。
ls命令:列出文件和目录
Ubuntu的终端默认是有颜色标注的,一般来说:
蓝色 --> 目录
绿色 --> 可执行文件
红色 --> 压缩文件
浅蓝色 --> 链接文件
灰色 --> 其他文件
如果在你的终端里没有标明颜色,那么你可以加上参数--color=auto
来开启颜色标注。如下:
ls --color=auto
如果你不需要颜色标注,那么可以用--color=none
来关闭颜色标注。如下:
ls --color=none
当然,为了避免每次都输入这么一串额外的参数,其实我们可以在一个配置文件里修改,使得永久显示颜色或不显示颜色。
-a :显示所有文件和目录,包括隐藏的
在Linux,以点(.
)开头的文件是隐藏文件,不过这里不包括开头的两个 .
和 ..
,这两个的含义如下:
-.
(一个点)表示当前目录。在当前情况下,就是 /home/oscar 。
-..
(两个点)表示上一级目录。因为当前目录是/home/oscar,所以上一级目录就是 /home 。
我们有一个大写的参数 -A,它的作用和小写的-a几乎一样,唯一不同就是-A不列出 . 和 .. 这两个文件。
-l :详细列表
-l 这个参数算是ls命令最常用的了。加上-l参数使得ls命令列出一个显示文件和目录的详细信息的列表。
-h:以Ko,Mo,Go的形式显示文件大小
当我们仅用ls -l时,列出的文件详细信息中,文件的大小是以字节为单位的。有时这不是太直观。我们可以再加一个参数-h,h是humain readable的缩写,表示“适合人类阅读的”。所以我们的命令变成了:
ls -lh
-t:按文件最近一次修改时间排序
t是time的缩写。
du:显示目录包含的文件大小
du命令也是很有用的,因为它可以让我们知道文件和目录所占的空间大小。
虽然ls -l命令也可以显示文件和目录的大小,但是du命令统计的才是真正的文件大小。du命令会深入遍历每个目录的子目录,把所有文件的大小都做一个统计。
du是英语disk usage的缩写,表示“磁盘使用/占用”。
我们的du命令也可以使用参数。
-h:以Ko,Mo,Go的形式显示文件大小
-a:显示文件和目录的大小
默认情况下,du命令只显示目录的大小。如果加上-a参数,则会显示目录和文件的大小。-s:只显示总计大小
文件操纵
cat命令和less命令:显示文件内容,这两个命令只能显示文件内容,并不能对文件内容进行修改。
cat命令
一次性显示文件的所有内容,如果你想要在显示的文件内容上加上行号,那么你可以加上 -n 这个参数。
less命令
分页显示文件内容
head命令和tail命令:显示文件的开头和结尾。
head命令
显示文件开头,默认情况下,head会显示文件的头10行。我们也可以指定显示的行数,用 -n 这个参数:
head -n 5 syslog
就会显示文件的头5行。
tail命令
显示文件结尾。默认情况下,tail会显示文件的尾10行。
我们也可以指定显示的行数,用 -n 这个参数:
tail -n 5 syslog
就会显示文件的尾5行。
tail命令还可以配合 -f 参数来实时追踪文件的更新:
tail -f syslog
这样,就会检查文件是否有追加内容,如果有,就显示新增内容。
默认地,tail -f会每过1秒检查一下文件是否有新内容。你也可以指定间隔检查的秒数,用 -s 参数:
tail -f -s 4 syslog #每隔4秒检查一次文件是否有更新
tail -f -s 2.5 syslog #每隔2.5秒检查一次文件是否有更新
可以用快捷键 Ctrl + c 来终止tail -f 命令。
touch命令和mkdir命令:创建文件和目录
touch命令
创建一个空白文件。事实上,Linux没有一个命令是专门用来创建一个空白文件的。touch命令其实一开始的设计初衷是修改文件的时间戳,就是可以修改文件的创建时间或修改时间,让电脑以为文件是在那个时候被修改或创建的。但是touch命令如果后面跟着的文件名是不存在的,那么它就会新建一个。
事实上,我们可以用touch命令同时创建多个文件:
touch new_file new_file_2
如果我所要创建的文件的名字里有空格怎么办呢?
很简单,加上双引号:
touch "new file"
mkdir
创建一个目录。
mkdir也可以同时创建好几个目录:
mkdir new_folder new_folder_2
如果我所要创建的目录的名字里有空格怎么办呢?
很简单,加上双引号:
mkdir "new folder"
我们还可以用 -p 参数来递归创建目录结构。
比如:
mkdir -p one/two/three
cp命令和mv命令:拷贝文件和移动文件
cp命令
拷贝文件或目录
cp是英语copy的缩写,表示“拷贝”。所以,顾名思义,此命令用于拷贝。cp命令不仅可以拷贝单个文件,还可以拷贝多个文件,也可以拷贝目录。
复制文件到另一个目录只需要把cp命令的第二个参数换成目录名。
cp new_file one/
拷贝目录
要拷贝目录,只要在cp命令之后加上-R参数(注意是大写的R)。拷贝的时候,目录中的所有内容(子目录和文件)都会被拷贝。
使用通配符*
*号(星号)是很常用的正则表达式的符号,被称为“通配符”,
所以如果我们用如下命令:
cp *.txt folder
那么就会把当前目录下所有txt文件拷贝到folder这个子目录当中。
又如:
cp ha* folder
那么就会把当前目录下凡是以ha开头的文件都拷贝到folder目录中。
mv命令
移动文件
mv是英语move的缩写,表示“移动”。mv命令有两个功能:
移动文件(或目录)
重命名文件(或目录)
用mv命令来移动目录很简单,不需要额外的参数,就跟移动文件一样:
mv new_folder one
当然,我们也可以使用通配符。
除了移动文件,mv命令还可以用于重命名文件。
事实上,Linux中没有一个专门的命令用于重命名文件。之所以mv命令可以重命名文件,其实还是归因于它的机制:移动文件。经过mv移动之后,原始文件变成了新的名字的文件,文件内容是不变的,这不就相当于重命名了吗?
mv new_file renamed_file
以上命令会将new_file重命名为renamed_file。
rm命令
删除文件和目录
rm命令可以删除一个文件,多个文件,目录,甚至你的整个Linux系统(如果你愿意的话)。
rm new_file_copy
以上命令删除当前目录下的new_file_copy这个文件。
我们也可以同时删除多个文件,只要用空格隔开每个文件即可。例如:
rm file1 file2 file3
-i 参数:向用户确认是否删除
保险起见,用rm命令删除文件时,可以加上 -i 参数,这样对于每一个要删除的文件,终端都会询问我们是否确定删除。i是英语inform的缩写,表示“告知,通知”。
有两种回答:
y:是英语yes的缩写,表示“是”。那么回车确认后,文件就删除了。
n:是英语no的缩写,表示“否”。那么回车确认后,文件不会删除。
-f参数:慎用,不会询问是否删除,强制删除
如果在rm命令后加上-f参数,那么终端不会询问用户是否确定删除文件,不论如何,文件会立刻被强制删除。
f是英语force的缩写。
rm -f file
以上命令会强制删除file文件。
-r参数:递归地删除
r是英语recursive的缩写,表示“递归的”。所以使用-r参数,可以使rm命令删除目录,并且递归删除其包含的子目录和文件。
这个命令也挺危险的,用得不好可能你的子目录和文件都没了。
rm -r one
以上命令会删除one这个目录,包括其子目录和文件。
其实,也存在一个命令
rmdir
看着和rm -r
挺像的。但是这个命令有个局限性:只能删除空的目录。
rm命令加-r和-f参数:极为危险!
千万不要这样做! => rm -rf /* 或者 rm -rf /
ln命令
创建链接
事实上,Linux下有两种链接类型:
Physical link:物理链接或硬链接。
Symbolic link:符号链接或软连接。
为了区分这两种链接类型的不同,我们首先来谈一谈如Linux这样的操作系统中文件在硬盘上的存放。
文件在硬盘上存储时,大致来说(请注意我用了“大致来说”),每个文件有两部分:
文件名
文件内容
文件名的列表是储存在硬盘的其他地方的,和文件内容分开存放,这样方便Linux管理。
注意:为什么我上面要用“大致说来”呢?因为此处我们简化了描述,其实每个文件有三部分:
文件名
权限
文件内容
我们这里简化地将文件分为两部分:文件名和文件内容。因为我们不想把事情复杂化,我们想要理解两种链接类型的区别,暂时只要知道这些就够了。
每个文件的文件内容被分配到一个标示号码,就是inode。因此每个文件名都绑定到它的文件内容(用inode标识)。原理如下图:
下面我们学习如何创建硬链接和软连接。
创建硬链接
比之软链接,硬链接的使用几率小很多。但是我们还是要学习一下,毕竟可能会用到。
硬链接的原理:使链接的两个文件共享同样的文件内容,也就是同样的inode。
所以一旦文件1和文件2之间有了硬链接,那么你修改文件1或文件2,其实修改的是相同的一块内容。只不过我们可以用两个文件名来取到文件内容。
硬链接有一个缺陷:只能创建指向文件的硬链接,不能创建指向目录的硬链接。但是软链接可以指向文件或目录。当然了,事实上,通过一些参数的修改,也可以创建指向目录的硬链接,但是比较复杂,这里不再详述。所以对于目录的链接,我们一般都是用软链接。
硬链接原理图:
要创建硬链接,直接用ln命令,不加任何参数:
ln file1 file2
我们可以用ls -i命令查看一下(-i参数可以显示文件的inode)。对于硬链接来说,删除任意一方的文件,共同指向的文件内容并不会从硬盘上被删除。
我们用ls -l命令查看文件信息的时候,第二列的那个2,其实是表示拥有相同inode号的文件数。不难理解,因为它们指向相同的文件内容,所以共享一个inode。
这个第二列的数字,一般来说对于普通文件,都是1,因为不同文件inode不同嘛。对于目录来说,这第二列的数字标明目录内所含文件数目。
创建软链接
其实,软链接才是真正像我们在Windows下的快捷方式的,其原理很相似。
创建硬链接是ln不带任何参数,但是要创建软链接需要加上-s参数。s是symbolic(符号的)的缩写。
ln -s file1 file2
file2指向的不再是file1的文件内容(和硬链接不同),而是指向file1的文件名。
软链接原理图:
用ls -l命令查看一下,会发现形式和之前的硬链接不一样噢,file2的信息是这样的: file2->file1,表示file2指向file1。
而且file2前面的权限那里的第一个字母变成了l,表示link(链接)。之前硬链接的时候是没有l的,硬链接外表看起来就和普通文件类似。
我们用ls -l命令查看文件信息的时候,第二列的那个1,表示拥有相同inode号的文件数。不难理解,因为file2指向file1,它们并没有指向同一块文件内容,所以它们的inode号不相同。
软链接的特点:
如果我们删除了file2,没什么大不了,file1不会受到影响。但是如果删除了file1,那么file2会变成“死链接”,因为指向的文件不见了。
-
软链接可以指向目录,硬链接不行。
可以看到,一旦删除了file1,那么file2就变成了红色,是标明此软链接已经损坏。因为file2指向的文件file1已经被删除,file2不知道要指向哪里了。