1、第二部分第四课:文件操纵,鼓掌之中
2、第二部分第五课预告:用户和权限
既然上一课我们学习了Linux中的文件组织方式,那么现在就该是玩弄,啊不,是操纵它们的时候了。
文件操作有哪些呢?一般就是显示文件内容啦,还有拷贝文件,移动文件,删除文件,等等。
这一课我们还会学习链接的知识,认识硬链接和软链接的区别和原理。
当然了,虽说是文件操作,但是目录操作我们也会说。因为在Linux中,一切皆文件,目录也是文件。
这一课有很重要的基础概念,而且要学不少命令,都是很常用的。
希望大家认真学习。但也不要怕,我们的课程会秉持浅显易懂的原则,带大家领略Linux的无穷魅力。
“酒过三巡难话休,菜过五味不絮烦”,小编你要做到“话休絮烦”,不难吧?
cat命令和less命令:显示文件内容
首先,我们来学习一下如何显示文件的内容。在Linux中,有好几个命令都可以显示文件内容,不过最常用的还是:
cat
less
这两个命令只能显示文件内容,并不能对文件内容进行修改。之后我们会学习如何编辑文件的,不过那需要一整课的内容才行。
也许你会问:“为什么要学习两个命令呢?既然这两个命令都能显示文件内容,我学一个不就好了?”
事实上,这两个命令各有特色。我们分别来学习。
在开始学习今天的这些命令之前,我们来介绍一个我们将要操作的文件:syslog。
syslog这个文件位于/var/log这个目录中。还记得上一课讲的么,/var这个目录通常包含程序的数据,比如一些log(日志)文件,记录电脑中发生了什么事。
我们用cd命令来进入/var/log,再用ls命令看看里面有什么东东:
cd /var/log ls
如下图所示:
可以看到好多种不同颜色的文件,记得我们上一课说的吗?
蓝色-->目录
绿色-->可执行文件
红色-->压缩文件
浅蓝色-->链接文件
灰色-->其他文件
我们看到syslog这个文件了,它是一个普通文件。不过这个文件很有用,因为它是当下你电脑里发生的几乎所有事情的日志。其实从名字我们也可以窥见一二,syslog由sys和log组成,sys是system的缩写,是英语“系统”的意思;log就是log,是英语“日志”的意思。
你可能注意到了,我们在Linux中看到的文件,很多都是没有后缀名的,如果习惯Windows的用户可能不太适应,因为Windows中一般这类文件会像这样命名:syslog.txt,syslog.log,等等。
即使Linux下很多文件没有后缀名,但这绝不影响它们的显示和编辑,和其他文件是一样的。
cat命令:一次性显示文件的所有内容
cat命令可以一次性在终端中显示文件的所有内容。
cat命令的用法也很简单,只需要在命令后加上想要显示的文件路径即可。例如:
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
显示如下:
less命令的好处是它会先读入文件开始的若干行,然后就停在那里,而这若干行的行数取决于终端屏幕的大小。这样的好处是我们可以有时间去渐进地读文件的内容。
所以,暂时说来,我们只读取了文件的头几行。
那怎么读取文件后面的内容呢?
让我们来学习一些有用的键盘快捷键吧。
首先来看less命令中最基本最常用的快捷键:
空格键:文件内容读取下一个终端屏幕的行数,相当于前进一个屏幕(页)。很常用的快捷键。与键盘上的PageDown(下一页)效果一样。
回车键:文件内容读取下一行,也就是前进一行。键盘上的向下键效果是一样的。
d键:前进半页(半个屏幕)。
b键:后退一页。与键盘上的PageUp(上一页)效果一样。
y键:后退一行。键盘上的向上键效果是一样的。
u键:后退半页(半个屏幕)。
q键:停止读取文件,中止less命令。
这里所说的快捷键当中提到字母时,大小写是需要区分的。比如我们说到d键,那么就是小写字母d,而不是大写字母D(shift + d)。在Linux中,通常来说都区分大小写。
再来看看一些略显高级的快捷键,虽然不像上面的几个那么常用,但学习一下也真是极好的:
=号:显示你在文件中的什么位置(会显示当前页面的内容是文件中第几行到第几行,整个文件所含行数,所含字符数,整个文件所含字符)。
h键:显示帮助文档。按q键退出帮助文档。
/(斜杠):进入搜索模式,只要在斜杠后面输入你要搜索的文字,按下回车键,就会把所有符合的结果都标识出来,要在搜索所得结果中跳转,可以按n键(跳到下一个符合项目),N键(跳到上一个符合项目)。当然了,正则表达式(Regular Expression)也是可以用在搜索内容中的。这里我们就不细说什么是正则表达式了,有兴趣可以百度看看。
n键:跳到下一个符合的搜索结果。
N键:跳到上一个符合的搜索结果。
如你所见,less命令很强大,可以帮助我们更好地浏览文件内容。
虽然说一开始要记着这些快捷键有点累人,但是熟练之后绝对让你事半功倍。
head命令和tail命令:显示文件的开头和结尾
额,除了cat和less,读取文件内容还有其他命令要学啊... 臣妾做不到啊...
但是这两个新命令可是很有用的,所以放下皇后的架子,来学一下吧。
这两个命令有点对立的关系,因为head命令用于显示文件的开头几行,tail命令用于显示文件结尾的几行。
head命令:显示文件开头
head在英语中是“头部”的意思,所以顾名思义,这个命令用于显示文件的开头。
默认情况下,head会显示文件的头10行:
head syslog
我们也可以指定显示的行数,用 -n 这个参数:
head -n 5 syslog
就会显示文件的头5行。
tail命令:显示文件结尾
tail在英语中是“尾部”的意思,所以顾名思义,这个命令用于显示文件的结尾。
默认情况下,tail会显示文件的尾10行。
我们也可以指定显示的行数,用 -n 这个参数:
tail -n 5 syslog
就会显示文件的尾5行。
如果你认为tail命令就这点本事,那您就大错特错啦... “大错特错不要来侮辱我的美,我不是你的style,为何偏偏缠着我”... 小编你药不能停啊~
tail命令还可以配合 -f 参数来实时追踪文件的更新:
tail -f syslog
这样,就会检查文件是否有追加内容,如果有,就显示新增内容。
可以用快捷键 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 命令,什么参数也不加。
使用touch命令创建新的空白文件之前,我们还得挪个地方,因为小编的家目录里面文件太多,不容易看到一会touch新生成的文件。所以我们cd到一个已存在的目录,比如我可以进入 linux_c 这个目录 (当然,作为读者的你完全可以用你自己的家目录,如果里面文件不多的话):
我们用ls -F 看到了目前存在于我们的 ~/linux_c 文件夹中的文件。
那么我们用touch命令来创建新文件看看:
看到了吗,我们用 touch new_file 创建了一个名叫 new_file 的新空白文件。
我们可以再来创建一个:
事实上,我们可以用touch命令同时创建多个文件:
touch new_file new_file_2
如果我所要创建的文件的名字里有空格怎么办呢?
很简单,加上双引号:
touch "new file"
mkdir:创建一个目录
如果说touch命令可以用来创建一个文件,那么mkdir命令就是用于创建一个目录的。
mkdir其实是mk和dir的缩合,mk是make的缩写,表示“创建”;dir是directory的缩写,表示“目录”。
所以,学编程过程中我们也可以边学英语,不是吗?
mkdir的用法也和touch一样,就是后面接需要创建的目录路径。
可以看到,我们用 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这个目录:
cp命令和mv命令:拷贝文件和移动文件
接着来学习很重要的文件拷贝和移动的操作,还有文件的重命名。
cp命令:拷贝文件或目录
cp是英语copy的缩写,表示“拷贝”。所以,顾名思义,此命令用于拷贝。cp命令不仅可以拷贝单个文件,还可以拷贝多个文件,也可以拷贝目录。
如果我们要拷贝刚才创建的new_file文件怎么做呢?很简单:
cp new_file new_file_copy
第一个文件new_file是已经存在的文件,也就是被拷贝的文件;第二个文件new_file_copy是需要创建的文件,是new_file的副本,内容一模一样。
我们可以看到,我们用cp命令在当前目录下创建了new_file的副本new_file_copy。
复制文件到另一个目录
上面的例子中,我们是在当前目录下拷贝了文件new_file,并生成了它的副本new_file_copy。
当然,我们并不一定要在同一个目录下拷贝。我们也可以把文件拷贝到其他目录。
只需要把cp命令的第二个参数换成目录名。
cp new_file one/
上面的命令就把new_file这个文件拷贝到了one这个目录中。
原先我们的one目录下只有two这个子目录,现在多了一个文件new_file,它的内容和one目录的上层目录linux_c中的new_file是一样的。
如果你想拷贝文件到其他目录的同时,不要具有相同名字,那么可以这样做:
cp new_file one/new_file_copy
看到了吗,one这个目录里多了一个new_file_copy的文件,它的内容和one目录的上层目录linux_c中的new_file是一样的。
拷贝目录
要拷贝目录,只要在cp命令之后加上-R参数(注意是大写的R)。拷贝的时候,目录中的所有内容(子目录和文件)都会被拷贝。
之前,我们创建了一个目录one,现在我们将其拷贝为one_copy看看:
看到了吗?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_filw_2这个文件移动到one这个目录,使得原先存在于linux_c这个目录的new_file_2文件不存在了。看到与cp的不同了吗,之前我们用cp命令的时候,原文件还是在的,只是把副本移动到了其他目录。
用mv命令来移动目录很简单,不需要额外的参数,就跟移动文件一样:
mv new_folder one
以上命令将new_folder这个目录(包括其下的子目录和文件)移动到one这个目录中。
当然,我们也可以使用通配符:
mv *.txt one
以上命令是将当前目录下所有txt文件移动到one这个目录中。
除了移动文件,mv命令还可以用于重命名文件。
事实上,Linux中没有一个专门的命令用于重命名文件。之所以mv命令可以重命名文件,其实还是归因于它的机制:移动文件。经过mv移动之后,原始文件变成了新的名字的文件,文件内容是不变的,这不就相当于重命名了吗?
mv new_file renamed_file
以上命令会将new_file重命名为renamed_file
希望大家好好练习cp和mv这两个命令,因为这两个命令真的很常用。
好了,经过了这一系列cp和mv的操作,现在我们的目录linux_c已经有点凌乱了。是时候做一些清理工作了,有请我们的rm命令。
rm命令:删除文件和目录
rm是英语remove的缩写,表示“移除”。这个命令就是用来删除东西的。
rm命令可不好惹。
为什么说它不好惹呢?因为在终端中没有回收站或垃圾箱,如果用rm命令删除了文件,那可没后悔药吃,一般比较难恢复(还是有办法可以恢复的,只是挺麻烦)。
所以rm命令用起来虽然很酸爽,但是还需谨慎啊。
rm命令可以删除一个文件,多个文件,目录,甚至你的整个Linux系统(如果你愿意的话)。
rm new_file_copy
以上命令删除当前目录下的new_file_copy这个文件。
我们也可以同时删除多个文件,只要用空格隔开每个文件即可。例如:
rm file1 file2 file3
-i 参数:向用户确认是否删除
保险起见,用rm命令删除文件时,可以加上 -i 参数,这样对于每一个要删除的文件,终端都会询问我们是否确定删除。i是英语inform的缩写,表示“告知,通知”。
有两种回答:
y:是英语yes的缩写,表示“是”。那么回车确认后,文件就删除了。
n:是英语no的缩写,表示“否”。那么回车确认后,文件不会删除。
上图中,我输入了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 /
ln命令:创建链接
虽然说ln这个命令不是特别常用,比之前的cp,mv,rm等使用频率要低,但是这个命令你迟早要用的吧,因为这个命令很有用。
ln是link的缩写,在英语中表示“链接”。所以ln命令用于在文件之间创建链接。说起链接可能你比较陌生,那么为了简单起见,我们用一个你比较熟悉的词好了:快捷方式。
虽然Linux的链接比起Windows的快捷方式要更复杂一些。但是性质是类似的。
事实上,Linux下有两种链接类型:
Physical link:物理链接或硬链接。
Symbolic link:符号链接或软连接。
为了区分这两种链接类型的不同,我们首先来谈一谈如Linux这样的操作系统中文件在硬盘上的存放。
好啦,不要做苦瓜脸啦,只不过讲一下操作系统的一些原理,对于我们更好地理解是很有帮助的。
文件的存储
在硬盘上存储时,大致来说(请注意我用了“大致来说”),每个文件有两部分:
文件名
文件内容
文件名的列表是储存在硬盘的其他地方的,和文件内容分开存放,这样方便Linux管理。
注意:为什么我上面要用“大致说来”呢?因为此处我们简化了描述,其实每个文件有三部分组成:
文件名
权限
文件内容
我们这里简化地将文件分为两部分:文件名和文件内容。因为我们不想把事情复杂化,我们想要理解两种链接类型的区别,暂时只要知道这些就够了。
每个文件的文件内容被分配到一个标示号码,就是inode。因此每个文件名都绑定到它的文件内容(用inode标识),原理如下图:
理解了这点就可以学习下面的了,暂时我们并不需要钻研太深。当然有兴趣的话,也可以百度一下inode,看一些资料,加深理解。
下面我们学习如何创建硬链接和软连接。
创建硬链接
比之软链接,硬链接的使用几率小很多。但是我们还是要学习一下,毕竟可能会用到。
硬链接的原理:使链接的两个文件共享同样的文件内容,也就是同样的inode。
所以一旦文件1和文件2之间有了硬链接,那么你修改文件1或文件2,其实修改的是相同的一块内容。只不过我们可以用两个文件名来取到文件内容。
硬链接有一个缺陷:只能创建指向文件的硬链接,不能创建指向目录的硬链接。但是软链接可以指向文件或目录。当然了,事实上,通过一些参数的修改,也可以创建指向目录的硬链接,但是比较复杂,这里不再详述。所以对于目录的链接,我们一般都是用软链接。
为了演示硬链接和软链接的操作,我们在家目录下新建一个目录吧。
cd mkdir test cd test
并且用touch命令创建一个新的空白文件:
touch file1
我们接着来创建一个文件file2,使之成为file1的硬链接。
要创建硬链接,直接用ln命令,不加什么参数:
ln file1 file2
以上命令创建了file1的一个硬链接file2。
硬链接原理图:
上图中,我们看到,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才会被删去。
我们用ls -l命令查看文件信息的时候,第二列的那个2,其实是表示拥有相同inode号的文件数,不难理解,因为它们指向相同的文件内容,所以共享一个inode。
这个第二列的数字,一般来说对于普通文件,都是1,因为不同文件inode不同嘛。对于目录来说,这第二列的数字标明目录内所含文件数目。
创建软链接
其实,软链接才是真正像我们在Windows下的快捷方式的,其原理很相似。
创建硬链接是ln不带什么参数,但是要创建软链接需要加上-s参数。s是symbolic(符号的)的缩写。
因为之前我们的test目录中,我们已经删除了file2这个文件。那么我们再来创建file1的软链接吧,还是命名为file2好了。
ln -s file1 file2
以上命令创建了file1的软链接file2。
软链接原理图:
可以看到上图中,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会变成“死链接”,因为指向的文件不见了。
软链接可以指向目录,硬链接不行。
可以看到,一旦删除了file1,那么file2就变成了红色,是标明此软链接已经损坏。因为file2指向的文件file1已经被删除,file2不知道要指向哪里了。
硬链接和软链接,我们大体上讲完了。也许还是有点晕,不过可以参考一些课外读物,加深理解。自己动手做做实验,就会慢慢理解了。
总结
cat命令用于显示文件的所有内容。不过如果文件内容太多,最好用less命令,可以分一页一页地显示文件。
我们可以用head和tail命令分别显示文件开头和结尾的若干行。特别地,使用tail -f,我们可以实时地显示文件的变化,对于随时间一直在改变的文件,例如日志(log)文件特别有用。
mkdir命令用于创建目录。touch命令用于创建空文件。使用mkdir -p,我们可以递归地创建目录结构。
cp命令用于拷贝文件或目录。mv命令用于移动文件或目录,也可以为文件重命名。
rm命令用于删除文件或目录。记住:终端里可没有“回收站”,所以删除前要谨慎考虑。
我们使用ln命令,可以创建指向文件的链接(类似类似Windows的快捷方式,但比快捷方式复杂)。
今天的课就到这里,一起加油吧!
下一课我们学习:用户和权限