Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

作者 谢恩铭 转载请注明出处
公众号「程序员联盟」(微信号:ProgrammerLeague )
原文:http://www.jianshu.com/p/45904376a66f

《Linux探索之旅》全系列

内容简介

  1. 第二部分第四课:文件操纵,股掌之中
  2. 第二部分第五课预告:用户和权限,有权就任性

文件操纵,股掌之中

既然上一课 Linux探索之旅 | 第二部分第三课:文件和目录,组织不会亏待你 中,我们学习了Linux中的文件组织方式,那么现在就该是玩弄,啊不,是操纵它们的时候了。

文件操作有哪些呢?一般就是显示文件内容啦,还有拷贝文件,移动文件,删除文件,等等。

这一课我们还会学习链接的知识,认识硬链接和软链接的区别和原理。

当然了,虽说是文件操作,但是目录操作我们也会说。因为在Linux中,一切皆文件,目录也是文件。

这一课有很重要的基础概念,而且要学不少命令,都是很常用的。

希望大家认真学习。但也不要怕,我们的课程会秉持浅显易懂的原则,带大家领略Linux的无穷魅力。

“酒经三巡难话休,菜过五味不絮烦”,小编你要做到“话休絮烦”,不难吧?

cat命令和less命令:显示文件内容

首先,我们来学习一下如何显示文件的内容。在Linux中,有好几个命令都可以显示文件内容,不过最常用的还是:

  • cat

  • less

这两个命令只能显示文件内容,并不能对文件内容进行修改。之后我们会学习如何编辑文件的,不过那需要一整课的内容才行。

也许你会问:“为什么要学习两个命令呢?既然这两个命令都能显示文件内容,我学一个不就好了?”

事实上,这两个命令各有特色。我们分别来学习。

在开始学习今天的这些命令之前,我们来介绍一个我们将要操作的文件:syslog。

syslog这个文件位于/var/log这个目录中。还记得上一课讲的么,/var这个目录通常包含程序的数据,比如一些log(日志)文件,记录电脑中发生了什么事。

我们用cd命令来进入/var/log,再用ls命令看看里面有什么:

cd /var/log
ls

如下图所示:

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

可以看到好多种不同颜色的文件,记得我们上一课说的吗?

  • 蓝色–>目录

  • 绿色–>可执行文件

  • 红色–>压缩文件

  • 浅蓝色–>链接文件

  • 灰色–>其他文件

我们看到syslog这个文件了,它是一个普通文件。不过这个文件很有用,因为它是当下你电脑里发生的几乎所有事情的日志。其实从名字我们也可以窥见一二,syslog由sys和log组成,sys是system的缩写,是英语“系统”的意思;log就是log,是英语“日志”的意思。

你可能注意到了,我们在Linux中看到的文件,很多都是没有后缀名的,如果习惯Windows的用户可能不太适应,因为Windows中一般这类文件会像这样命名:syslog.txt,syslog.log,等等。

即使Linux下很多文件没有后缀名,也不影响它们的显示和编辑,和其他文件是一样的。

cat命令:一次性显示文件的所有内容

cat命令可以一次性在终端中显示文件的所有内容。

cat命令的用法也很简单,只需要在命令后加上想要显示的文件路径即可。例如:

cd /var/log
cat syslog

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

syslog文件的内容很多,一页根本显示不下,所以我们的截图只能看到一页内容,其实下面还有很多。

不过,cat命令的初衷就是如此:显示文件的所有内容。不过我们也意识到了,cat命令更适合处理小文件。

cat命令没有什么参数比较值得学习。因为这个命令比较简单,如果你想要在显示的文件内容上加上行号,那么你可以加上 -n 这个参数:

cat -n syslog

less命令:分页显示文件内容

cat命令会把文件所有内容一下子显示出来,如果文件比较大,是会令人“猝不及防”的。

这种时候,另外的一个命令less就显得必不可少了。less命令和cat命令之间最大的区别就是:less命令会分一页一页地显示文件内容,使我们可以方便地在终端里阅读。

当然了,其实还有个命令是more。不过这个more命令和less命令的功能是类似的,而且more的缺陷就是它没有less那么强大,比如more命令虽然也是一页一页地显示文件,但是我们不能往后翻页,只能往前,“一路向北”。

而且less命令还有更多其他功能是more没有的,究其原因呢就是more是比较老的命令了。这年头毕竟是吃“青春饭”的,more命令只能说:“臣妾做不到啊”…

less命令的用法与cat命令是一样的,也是在命令之后直接加文件的路径:

less syslog

显示如下:

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

less命令的好处是它会先读入文件开始的若干行,然后就停在那里,而这若干行的行数取决于终端屏幕的大小。这样的好处是我们可以有时间去渐进地读文件的内容。

所以,暂时说来,我们只读取了文件的头几行。

那怎么读取文件后面的内容呢?

让我们来学习一些有用的键盘快捷键吧。

首先来看less命令中最基本最常用的快捷键:

  • 空格键:文件内容读取下一个终端屏幕的行数,相当于前进一个屏幕(页)。很常用的快捷键。与键盘上的PageDown(下一页)效果一样。

  • 回车键:文件内容读取下一行,也就是前进一行。与键盘上的向下键效果是一样的。

  • d键:前进半页(半个屏幕)。

  • b键:后退一页。与键盘上的PageUp(上一页)效果一样。

  • y键:后退一行。与键盘上的向上键效果是一样的。

  • u键:后退半页(半个屏幕)。

  • q键:停止读取文件,中止less命令。

这里所说的快捷键当中提到字母时,大小写是需要区分的。
比如我们说到d键,那么就是小写字母d,而不是大写字母D(shift + d)。
在Linux中,通常来说都区分大小写。

再来看看一些略显高级的快捷键,虽然不像上面的几个那么常用,但学习一下也真是极好的:

  • =号:显示你在文件中的什么位置(会显示当前页面的内容是文件中第几行到第几行,整个文件所含行数,所含字符数,整个文件所含字符)。

  • h键:显示帮助文档。按q键退出帮助文档。

  • /(斜杠):进入搜索模式,只要在斜杠后面输入你要搜索的文字,按下回车键,就会把所有符合的结果都标识出来。要在搜索所得结果中跳转,可以按n键(跳到下一个符合项目),N键(shift键+n。跳到上一个符合项目)。当然了,正则表达式(Regular Expression)也是可以用在搜索内容中的。这里我们就不细说什么是正则表达式了,有兴趣可以百度看看。

  • n键:跳到下一个符合的搜索结果。

  • N键:跳到上一个符合的搜索结果。

如你所见,less命令很强大,可以帮助我们更好地浏览文件内容。

虽然说一开始要记着这些快捷键有点累人,但是熟练之后绝对让你事半功倍。

head命令和tail命令:显示文件的开头和结尾

额,除了cat和less,读取文件内容还有其他命令要学啊… “臣妾做不到啊…”

但是这两个新命令可是很有用的,特别是tail。所以放下“皇后”的架子,来学一下吧。

这两个命令有点对立的关系,因为head命令用于显示文件的开头几行,tail命令用于显示文件结尾的几行。

head命令:显示文件开头

head在英语中是“头部”的意思,所以顾名思义,这个命令用于显示文件的开头。

默认情况下,head会显示文件的头10行:

head syslog

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

我们也可以指定显示的行数,用 -n 这个参数:

head -n 5 syslog

就会显示文件的头5行。

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

tail命令:显示文件结尾

tail在英语中是“尾部”的意思,所以顾名思义,这个命令用于显示文件的结尾。

默认情况下,tail会显示文件的尾10行。

我们也可以指定显示的行数,用 -n 这个参数:

tail -n 5 syslog

就会显示文件的尾5行。

如果你认为tail命令就这点本事,那您就大错特错啦… “大错特错不要来侮辱我的美,我不是你的style,为何偏偏缠着我”… 小编你药不能停啊~

tail命令还可以配合 -f 参数来实时追踪文件的更新:

tail -f syslog

这样,就会检查文件是否有追加内容,如果有,就显示新增内容。

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

可以用快捷键 Ctrl + c 来终止tail -f 命令。

事实上,Ctrl + c这个组合快捷键(同时按下)可以终止大部分终端的命令和正在执行的程序,有点类似Windows中的Alt + F4。

默认地,tail -f会每过1秒检查一下文件是否有新内容。你也可以指定间隔检查的秒数,用 -s 参数:

tail -f -s 4 syslog      #每隔4秒检查一次文件是否有更新
tail -f -s 2.5 syslog    #每隔2.5秒检查一次文件是否有更新

touch命令和mkdir命令:创建文件和目录

长舒一口气吗?终于结束了如何显示文件的学习。

我们再来看看其他文件操作。

touch命令:创建一个空白文件

事实上,Linux没有一个命令是专门用来创建一个空白文件的。

平时我们习惯用文本编辑器(Emacs,Vim,gedit,Sublime Text,nano等)来创建空白文件,并且编辑文件。

touch命令其实一开始的设计初衷是修改文件的时间戳,就是可以修改文件的创建时间或修改时间,让电脑以为文件是在那个时候被修改或创建的。

touch在英语中是“触摸,触碰”的意思,就是说我碰一下那个文件,让电脑以为我刚修改过。

但是,为什么把touch命令放在这里来学习呢?因为touch命令如果后面跟着的文件名是不存在的,那么它就会新建一个。

touch的用法也比较简单,就是touch命令后面直接跟文件路径。

我们在演示touch命令的用法前,得先挪个地方,因为我们不希望在 /var/log 这个系统目录里“搞七捻三”。

如果你认真学习了前几课,那么你应该知道如何快速的回到我们的用户家目录,是的,就是单独一个 cd 命令,什么参数也不加。

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

使用touch命令创建新的空白文件之前,我们还得挪个地方,因为小编的家目录里面文件太多,不容易看到一会touch新生成的文件。

所以我们cd到一个已存在的目录,比如我可以进入 linux_c 这个目录 (当然,作为读者的你完全可以用你自己的家目录,如果里面文件不多的话):

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

我们用ls -F 看到了目前存在于我们的 ~/linux_c 文件夹中的文件。

那么我们用touch命令来创建新文件:

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

看到了吗,我们用 touch new_file 创建了一个名叫 new_file 的新空白文件。

我们可以再来创建一个:

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

事实上,我们可以用touch命令同时创建多个文件:

touch new_file new_file_2

如果我所要创建的文件的名字里有空格怎么办呢?

很简单,加上双引号:

touch "new file"

不过,在Linux中,还是尽量不要让文件或目录名字中有空格,有时会给编程造成麻烦。

mkdir:创建一个目录

如果说touch命令可以用来创建一个文件,那么mkdir命令就是用于创建一个目录的。

mkdir其实是mk和dir的缩合,mk是make的缩写,表示“创建”;dir是directory的缩写,表示“目录”。

所以,学编程过程中我们也可以边提高英语,不是吗?

mkdir的用法也和touch一样,就是后面接需要创建的目录路径。

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

可以看到,我们用 mkdir new_folder 创建了一个名叫 new_folder 的新目录,这个目录里当然还没有什么东西。

可以看到用 ls -F 命令后,显示的new_folder是深蓝色的,表示它是一个目录。

mkdir也可以同时创建好几个目录:

mkdir new_folder new_folder_2

如果我所要创建的目录的名字里有空格怎么办呢?

很简单,加上双引号:

mkdir "new folder"

我们还可以用 -p 参数来递归创建目录结构。

比如:

mkdir -p one/two/three

就会先创建one这个目录,在one目录里面创建two这个目录,在two里面再创建three这个目录:

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

cp命令和mv命令:拷贝文件和移动文件

接着来学习很重要的文件拷贝和移动的操作,还有文件的重命名。

cp命令:拷贝文件或目录

cp是英语copy的缩写,表示“拷贝”。所以,顾名思义,此命令用于拷贝。cp命令不仅可以拷贝单个文件,还可以拷贝多个文件,也可以拷贝目录。

如果我们要拷贝刚才创建的new_file文件怎么做呢?很简单:

cp new_file new_file_copy

第一个文件new_file是已经存在的文件,也就是被拷贝的文件;第二个文件new_file_copy是需要创建的文件,是new_file的副本,内容一模一样。

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

我们可以看到,我们用cp命令在当前目录下创建了new_file的副本new_file_copy。

复制文件到另一个目录

上面的例子中,我们是在当前目录下拷贝了文件new_file,并生成了它的副本new_file_copy。

当然,我们并不一定要在同一个目录下拷贝。我们也可以把文件拷贝到其他目录。

只需要把cp命令的第二个参数换成目录名。

cp new_file one/

上面的命令就把new_file这个文件拷贝到了one这个目录中。

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

原先我们的one目录下只有two这个子目录,现在多了一个文件new_file,它的内容和one目录的上层目录linux_c中的new_file是一样的。

如果你想拷贝文件到其他目录的同时,不要具有相同名字,那么可以这样做:

cp new_file one/new_file_copy

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

看到了吗,one这个目录里多了一个new_file_copy的文件,它的内容和one目录的上层目录linux_c中的new_file是一样的。

拷贝目录

要拷贝目录,只要在 cp 命令之后加上 -r 或者 -R参数(大写和小写作用是一样的,都表示 recursive,也就是“递归的”)。拷贝的时候,目录中的所有内容(子目录和文件)都会被拷贝。

之前,我们创建了一个目录one,现在我们将其拷贝为one_copy看看:

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

看到了吗?one_copy目录中的内容和one里面一模一样。

使用通配符 *

*号(星号)是很常用的正则表达式的符号,被称为“通配符”,顾名思义就是百搭,可以替代任意字符串。

所以如果我们用如下命令:

cp *.txt folder

那么就会把当前目录下所有txt文件拷贝到folder这个子目录当中。

又如:

cp ha* folder

那么就会把当前目录下凡是以ha开头的文件都拷贝到folder目录中。

通配符是极为强大的,如果用得好,可以大大提高效率。是不是觉得比在Windows下用鼠标拷贝文件快捷很多呢?

mv命令:移动文件

mv是英语move的缩写,表示“移动”。mv命令有两个功能:

  • 移动文件(或目录)

  • 重命名文件(或目录)

移动文件

与cp命令用法类似,不同的是cp命令会复制当前文件,而mv命令则是单纯的移动,并不会制作副本。

所以,cp命令就好比Windows中的复制+黏贴,而mv命令就好比Windows中的剪切+黏贴。

mv new_file_2 one

以上命令将 new_file_2 这个文件移动到one这个目录,使得原先存在于 linux_c 这个目录的 new_file_2 文件不存在了。

看到与cp的不同了吗,之前我们用cp命令的时候,原文件还是在的,只是把副本移动到了其他目录。

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

用mv命令来移动目录很简单,不需要额外的参数,就跟移动文件一样:

mv new_folder one

以上命令将new_folder这个目录(包括其下的子目录和文件)移动到one这个目录中。

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

当然,我们也可以使用通配符:

mv *.txt one

以上命令是将当前目录下所有txt文件移动到one这个目录中。

除了移动文件,mv命令还可以用于重命名文件。

事实上,Linux中没有一个专门的命令用于重命名文件。之所以mv命令可以重命名文件,其实还是归因于它的机制:移动文件。经过mv移动之后,原始文件变成了新的名字的文件,文件内容是不变的,这不就相当于重命名了吗?

mv new_file renamed_file

以上命令会将new_file重命名为renamed_file

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

希望大家好好练习cp和mv这两个命令,因为这两个命令真的很常用。

好了,经过了这一系列cp和mv的操作,现在我们的目录linux_c已经有点凌乱了。是时候做一些清理工作了,有请我们的rm命令。

rm命令:删除文件和目录

rm是英语remove的缩写,表示“移除”。这个命令就是用来删除东西的。

rm命令可不好惹。

为什么说它不好惹呢?因为在终端中没有回收站或垃圾箱,如果用rm命令删除了文件,那可没后悔药吃,一般比较难恢复(还是有办法可以恢复的,只是挺麻烦)。

所以rm命令用起来虽然很酸爽,但是还需谨慎啊。

rm命令可以删除一个文件,多个文件,目录,甚至你的整个Linux系统(如果你愿意的话)。

rm new_file_copy

以上命令删除当前目录下的new_file_copy这个文件。

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

我们也可以同时删除多个文件,只要用空格隔开每个文件即可。例如:

rm file1 file2 file3

-i 参数:向用户确认是否删除

保险起见,用rm命令删除文件时,可以加上 -i 参数,这样对于每一个要删除的文件,终端都会询问我们是否确定删除。i是英语inform的缩写,表示“告知,通知”。

有两种回答:

  • y:是英语yes的缩写,表示“是”。那么回车确认后,文件就删除了。

  • n:是英语no的缩写,表示“否”。那么回车确认后,文件不会删除。

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

上图中,我输入了 n,再回车,那么 rm 命令就不生效,文件没有被删除。如果我输入的是 y,那么文件就会被删除。

-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 /* 或者 rm -rf /

请读者千万不要抱着试试看的心态,复制这条命令,然后用管理员身份运行这条命令。因为这条命令会删除你的整个Linux系统,如果你的Windows系统也挂载在Linux下,那么也会把你的Windows系统删了。所以,千万不要玩火!

这条命令可谓是Linux中头号一等危险的命令。历史上有一些公司就因为这个命令造成过惨重的损失。

我们把这条命令分解开来分析:

  • rm:rm命令,这个没问题吧,删除命令么。

  • -r:递归删除。

  • -f:不询问,强制删除。

  • /:系统的根目录。后面可以不加通配符*,也可以加。

所以整个命令的意思很明确:强制递归删除根目录下所有文件!

但你要问了:“既然有这么危险的命令,那么为什么Linux的开发者允许这样的命令存在呢?”

这是因为,不一定是谁都可以运行这条命令的,比如我暂时是以oscar这个用户登录的,oscar是普通用户,是不具备执行这条命令的权限的,但如果是系统的超级用户,大管家root的话,执行这条命令是完全没问题的。

所以,这也是为什么我们说初学者尽量不要登录为root。

下一课我们会讲用户和权限,到时候会有更深理解。

最后提醒一次:不管何种情况,千万不要运行这条命令: rm -rf /

当然了,Ubuntu 系统中,如果你用 root 权限运行 rm -rf / 也是没问题的,因为它已经有了保护机制,如果你运行,会看到以下信息:

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

可以看到,什么也没有发生,终端显示了两条信息:

rm: it is dangerous to operate recursively on '/'

上面这句英语意思是:“在根目录 / 上递归地运行 rm 命令是危险的”。

rm: use --no-preserve-root to override this failsafe

上面这句英语意思是:“如果你坚持要在根目录 / 上递归地运行 rm 命令,那么请加上 –no-preserve-root 来取消保护”。

也就是说,如果你用这句命令:

sudo rm -rf --no-preserve-root /

那么,就会递归删除根目录下所有文件。

所以,这也是我们喜欢 Ubuntu 系统的原因之一。不怕你不小心运行了这条可怕的命令:rm -rf /

当然了,你可别先进入根目录,

cd /

然后再用下面命令:

sudo rm -rf *

因为我在为了测试创建的一个虚拟机里用以上命令尝试过,会递归删除系统文件。然后就几乎啥都没了。

不过没关系,那个虚拟机本来就是我创建来测试 rm 命令的。VirtualBox 的好处就是,你可以创建无数个虚拟机,想怎么玩就怎么玩。

所以,Ubuntu 系统对下面的命令是没有防护措施的:

cd /
sudo rm -rf *

总结:rm -rf 命令是很危险的,用之前请先搞清楚自己所在的目录,以及后面所加的路径。以免铸成大错!

ln命令:创建链接

虽然说ln这个命令不是特别常用,比之前的cp,mv,rm等使用频率要低,但是这个命令很有用。

ln是link的缩写,在英语中表示“链接”。所以ln命令用于在文件之间创建链接。说起链接可能你比较陌生,那么为了简单起见,我们用一个你比较熟悉的词好了:快捷方式。

虽然Linux的链接比起Windows的快捷方式要更复杂一些。但是性质是类似的。

事实上,Linux下有两种链接类型:

  • Physical link:物理链接或硬链接。

  • Symbolic link:符号链接或软连接。

为了区分这两种链接类型的不同,我们首先来谈一谈如Linux这样的操作系统中文件在硬盘上的存放。

好啦,不要做苦瓜脸啦,只不过讲一下操作系统的一些原理,对于我们更好地理解是很有帮助的。

文件的存储

在硬盘上存储时,大致来说(请注意我用了“大致来说”),每个文件有两部分:

  • 文件名

  • 文件内容

文件名的列表是储存在硬盘的其他地方的,和文件内容分开存放,这样方便Linux管理。

注意:为什么我上面要用“大致说来”呢?因为此处我们简化了描述,其实每个文件有三部分:

  • 文件名

  • 权限

  • 文件内容

我们这里简化地将文件分为两部分:文件名和文件内容。因为我们不想把事情复杂化,我们想要理解两种链接类型的区别,暂时只要知道这些就够了。

每个文件的文件内容被分配到一个标示号码,就是inode。因此每个文件名都绑定到它的文件内容(用inode标识),原理如下图:

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

理解了这点就可以学习下面的了,暂时我们并不需要钻研太深。当然有兴趣的话,也可以百度一下inode,看一些资料,加深理解。

下面我们学习如何创建硬链接和软连接。

创建硬链接

比之软链接,硬链接的使用几率小很多。但是我们还是要学习一下,毕竟可能会用到。

硬链接的原理:使链接的两个文件共享同样的文件内容,也就是同样的inode。

所以一旦文件1和文件2之间有了硬链接,那么你修改文件1或文件2,其实修改的是相同的一块内容。只不过我们可以用两个文件名来取到文件内容。

硬链接有一个缺陷:只能创建指向文件的硬链接,不能创建指向目录的硬链接。但是软链接可以指向文件或目录。当然了,事实上,通过一些参数的修改,也可以创建指向目录的硬链接,但是比较复杂,这里不再详述。所以对于目录的链接,我们一般都是用软链接。

为了演示硬链接和软链接的操作,我们在家目录下新建一个目录吧。

cd
mkdir test
cd test

并且用touch命令创建一个新的空白文件:

touch file1

我们接着来创建一个文件file2,使之成为file1的硬链接。

要创建硬链接,直接用ln命令,不加任何参数:

ln file1 file2

以上命令创建了file1的一个硬链接file2。

硬链接原理图:

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

上图中,我们看到,file2是新生成的硬链接,它指向file1的文件内容,也就是说它们共享相同的文件内容,也就是拥有同一个inode。

我们用ls -l命令看一下,仿佛看不出什么端倪。因为目前看来,并没什么因素使我们相信这两个文件指向同一块文件内容(同一个inode)。不过从浅蓝色可以看出,这两个都是链接文件。

但是我们可以用ls -i命令查看一下(-i参数可以显示文件的inode)。我们可以看到file1和file2的inode是一样的,都是3022618。当然你的电脑上应该和我不一样,是其他数字。

如果我们用rm file2来删除file2,那么对file1没什么影响。如果我们用rm file1来删除file1,对file2也没什么影响。所以,对于硬链接来说,删除任意一方的文件,共同指向的文件内容并不会从硬盘上被删除。

只有既删除file1又删除file2,它们共同指向的文件内容才会消失,也就是那个inode才会被删去。

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

我们用ls -l命令查看文件信息的时候,第二列的那个2,其实是表示拥有相同inode号的文件数。不难理解,因为它们指向相同的文件内容,所以共享一个inode。

这个第二列的数字,一般来说对于普通文件,都是1,因为不同文件inode不同嘛。对于目录来说,这第二列的数字标明目录内所含文件数目。

创建软链接

其实,软链接才是真正像我们在Windows下的快捷方式的,其原理很相似。

创建硬链接是ln不带任何参数,但是要创建软链接需要加上-s参数。s是symbolic(符号的)的缩写。

因为之前我们的test目录中,我们已经删除了file2这个文件。那么我们再来创建file1的软链接吧,还是命名为file2好了。

ln -s file1 file2

以上命令创建了file1的软链接file2。

软链接原理图:

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

可以看到上图中,file2指向的不再是file1的文件内容(和硬链接不同),而是指向file1的文件名。

用ls -l命令查看一下,会发现形式和之前的硬链接不一样噢,file2的信息是这样的: file2->file1,表示file2指向file1。

而且file2前面的权限那里的第一个字母变成了l,表示link(链接)。之前硬链接的时候是没有l的,硬链接外表看起来就和普通文件类似。

我们用ls -l命令查看文件信息的时候,第二列的那个1,表示拥有相同inode号的文件数。不难理解,因为file2指向file1,它们并没有指向同一块文件内容,所以它们的inode号不相同。

用ls -i看一下就知道了:

file1的inode号仍然是3022618,而file2的inode号是3022612,不一样。

打开file2查看其内容,发现其内容和file1是一样的。这不难理解,因为其实file2这个软链接只是file1的一个快捷方式,它指向的是file1,所以显示的是file1的内容。但其实它自身的inode和file1并不一样,也就是文件内容不一样。

软链接的特点:

  • 如果我们删除了file2,没什么大不了,file1不会受到影响。但是如果删除了file1,那么file2会变成“死链接”,因为指向的文件不见了。

  • 软链接可以指向目录,硬链接不行。

《Linux探索之旅 | 第二部分第四课:文件操纵,股掌之中》

可以看到,一旦删除了file1,那么file2就变成了红色,是标明此软链接已经损坏。因为file2指向的文件file1已经被删除,file2不知道要指向哪里了。

硬链接和软链接,我们大体上讲完了。也许还是有点晕,不过可以参考一些课外读物,加深理解。自己动手做做实验,就会慢慢理解了。

总结

  1. cat命令用于显示文件的所有内容。不过如果文件内容太多,最好用less命令,可以一页一页地显示文件。

  2. 我们可以用head和tail命令分别显示文件开头和结尾的若干行。特别地,使用tail -f,我们可以实时地显示文件的变化,对于随时间一直在改变的文件,例如日志(log)文件特别有用。

  3. mkdir命令用于创建目录。touch命令用于创建空文件。使用mkdir -p,我们可以递归地创建目录结构。

  4. cp命令用于拷贝文件或目录。mv命令用于移动文件或目录,也可以为文件重命名。

  5. rm命令用于删除文件或目录。记住:终端里可没有“回收站”,所以删除前要谨慎考虑。

  6. 我们使用ln命令,可以创建指向文件的链接(类似Windows的快捷方式,但比快捷方式复杂)。

第二部分第五课预告

今天的课就到这里,一起加油吧!

下一课我们学习:Linux探索之旅 | 第二部分第五课:用户和权限,有权就任性

我是 谢恩铭,在巴黎奋斗的软件工程师。
我创建了程序员联盟的 知识星球,欢迎加入。
热爱生活,喜欢游泳,略懂烹饪。
人生格言:「向着标杆直跑」

点赞