登录系统输入用户名和密码以后,会显示给我们一个命令提示符,就意味着我们在这里就可以输入命令了,给一个命令,这个命令必须要可执行,那问题是我的命令怎么去使用,命令格式有印象吗?在命令提示符下,我们首先是命令吧?command,后面可以带什么?参数对吗?options,再后面是arguments,我们把它称为叫参数,这是选项。选项有可能会有多个,参数也有可能会有多个,有的命令可能不能带参数,有的命令可能没有选项,这是各不相同的,我们这里给的仅是一个通用的架构,或者是一个常见的应用格式,而且之前提到过,选项有两种格式,有所谓的短选项和长选项的概念,短选项是可以合并的,还有长选项。然后是参数,对吧?选项是用来干什么的?
修改命令的执行特性的对不对?而参数呢?指定命令的作用对象的,这个命令对谁进行生效?所以大家一定要理解他们彼此间的意义,那如果说有多个选项或者有多个参数的话,那命令选项参数彼此之间必须要使用空格隔开,这是我们的基本使用格式,当然此前如果使用此内容不太多的话,很容易犯这种错误,老是忘了加空格。
好了,这里还需要交代的是在命令当中,有些选项是可以带参数的,注意选项的参数和命令参数是两码事,这个还需要注意,有些选项我再说一遍,有些选项是可以带参数的,回头讲到的时候再做具体说明。好,那比如,之前我曾经输入这样的命令,给了个ls,回车,还记得吧,这又是个简写的命令,叫做list,所以简写为ls,那是表示什么意思呢?列表列出的意思,对吗?OK,列出列表,那因此,它能够列出你所指定目录下的所有的子目录或者文件,列出指定路径下的所有目录或者文件的,当然也包括子目录,其实目录也是文件,以后讲到了。
当然,在Windows当中,我们通常把它称为叫文件夹,对吧?OK,那文件夹是个什么玩意儿?
那文件夹就是文件夹呗,是不是?那因此,在你想象出来目录是不是是一个容器,对吗?它里边可以放文件的,对不对?事实上,完全不是这么回事。目录它不是文件夹,这是Windows给你的误导,它仅仅是个路径映射而已,回头讲到文件系统的时候,再细细说明为什么,目录到底是什么东西,将来就会明白为什么需要缓存目录,将来要提升系统的话,为什么需要去调整这些可以缓存的空间大小等等。
这些概念都是一体的。好,那所以再说一遍,先知道,其实目录也是文件。它其实也是一种文件,只不过这种文件比较独特,它是一种路径映射文件,这里又提到了路径,当然,对各位来讲,路径应该很多,很容易理解是吧?路径指的是什么?路径是从指定起始点到目的地所经过的位置。
所经过的什么位置,我们就把它称为叫路径。当然,路径在我们现实生活中,用这种方式来进行描述,很容易理解,那在系统上为什么要用到路径的概念?为什么要用到路径呢?其实也很容易理解,这只是为了能够实现层次化文件管理的一种机制。想象一下,如果说把全国人民放在同一个范围内进行编号标识的话,引用起来是不是非常非常麻烦?所以我们把全国人民分成了各个区域,
把全国分成了各个区域,河南,浙江,上海等等,每个区域下还有子区域,子区域还有子子区域,
子又生孙,孙又生子,是不是?大概就是这个概念。
那为什么要划分这么多区域呢?层次型的结构可以实现很快的、利用非常短的路径去快速追溯一个目标。再举个简单例子,比如说我在磁盘上放了十万个文件,从中找出一个叫做jerry的文件,需要花多长时间去找?想过这个问题吗?一共有十万个文件,其中有一个叫做jerry,当去找的时候,压根就不知道这个文件在什么位置,是不是?那就意味着必须要遍历,从第一个开始找,如果很幸运,那第一个很可能就是,如果足够不幸的话,最后一个才是。是吧,那我们查找文件的平均时间是非常长的,平均下来要查找五万次才能找到这个文件,但是我们如果层次化管理的话,有什么好处呢?比如说,首先画成26个目录,以某个字母开头的就放在这个目录里边,那因此,当我们去找jerry的时候,你只要找到j的目录是不是就OK了?而在j目录里边,假如说只有一万个,这是不是简单多了?能理解概念吗?所以这就是层次化管理的好处。
那既然有了层次化,那就意味着我们要标识某一个文件,就从顶开始,全部的文件底下找到j那个目录,然后再找到e开头的那个子目录,r开头那个子子目录,这不是jerry吗?是不是这个道理啊?最终才能找到jerry。从而我们去标识某一个文件的时候,它的速度就非常非常快了,这就是所谓的为什么要实现层次化文件管理,而这样一个层次化文件管理的机制,我们把它称为文件系统,file system。
普天之下,莫非王土,率土之滨,莫非王臣就这个道理,那因此,在整个linux上,所有的文件肯定都属于当前系统的,对吗?那因此它有个制高点,从这个位置开始,你能找到所有文件,这就我们的最大范围,在这个范围内,我们有很多的子目录,子目录里边有子子目录,对不对?如下图,
但是用这种方式去理解的话,可能看起来结构不够明晰。因此linux的目录结构,通常把它称为叫树状目录结构,倒置的树状,最上头的把它称为叫根,A称之为叫根,向下的有一级子目录,二级子目录等等,如下图,
那要找到某一个特定文件,怎么去找?如何去找某一个特定文件?比如说像这个D文件,D的位置,注意,有的节点可以分叉,像这里有的节点不能分叉,对吗?像可以分叉的节点,把它称为叫目录,可以理解吗?它是个路径,而不能分叉的节点,把它称为叫文件,D是个叶子结点。
那因此我们要找到这个文件,就意味着从A到这个一级子目录到二级子目录,是不是就可以找到这个文件了?OK,这种表示从根开始往下找的一种机制,这种把它称为叫绝对路径,对吧?叫做绝对路径。因为无论如何,我从根这里开始找,一定会能找到你想要找的文件,那什么叫相对路径呢?有绝对就有相对。OK,事实上,任何时候,当你登录系统以后,你一定会处在某个目录当中。比方说,我打开Windows,默认就处在桌面上,对不对?桌面是不是一个目录?是,桌面其实也是一个目录。所以你只要登录系统,以后无时无刻或者每时每刻都处在某个目录。这个目录我们把它称为叫做当前目录,也叫工作目录。一定要理解目录的概念。登录系统以后,在每一个时刻都一定处在某个目录上。这个我们把它称为叫working directory。我们称为叫工作目录,或者叫当前目录,current directory。那仍然以上图为例,比如说,你此刻站在C位置,我让你去找D文件,你还非得从根去找,有必要没有?因为它在当前目录下是不是就有啊,能明白了吗?所以什么叫相对路径?相对于当前所处位置的路径,我们把它称为叫相对目录。那很显然,问题是如果你站E位置的话,能不能相对啊?也能,只不过你得先回到B位置,最起码的回到它从根到D位置上所要经过的某一个点上才行,那所以相对一定是在从根到目的地,中间这个路径上的某个节点上,你有这个位置,否则的话你是无法相对的。OK,所以你站在D位置去相对是相对不过去的,除非你倒回来先倒到B位置,倒到最近的那个位置上,才能进行相对,这种把它称为叫相对路径。
好,这就我们整个linux的文件系统的大体上的一个结构描述,当然这些一级子目录二级子目录,尤其是一级子目录在Linux系统上,它有一个规定,必须要存在这么多个一级字母,不知道大家有没有留意过,无论使用ubuntu或debian,里面有些目录是必然会有的,什么bins、sbin等等。
为什么会有,这是linux标准委员会当中,曾经定义了一个规范,叫做fhs,system hierarchy standard叫文件系统层级结构标准。它里边规定了有些目录是必须存在,而且这些目录下要放什么样类别的文件,后面会详细的去讲,一个一个去解释这些目录下都有什么文件,因为这些目录是标准化的,所以我必须得记得住,回头再说,但不管怎么讲,应该知道它是一种层级化的结构就OK。好,我这里先给大家预留一个问题,比如说文件名,是不是文件的数据?文件名是不是文件的数据?每一个文件是不是都有名字啊?都有大小,都有权限,很多属性对不对?这些东西,它也是数据对吧?但这些数据是不是文件本身的数据?对于一个人来讲,这个人的体重,年龄,性别,身高,名字等各种属性,是不是一个人的组成部分?不是,那它又存储在什么地方了呢?那想象一下,我们要在文件系统上存储一个文件,这文件通常我们是不是都使用名字去找的?一个文件打开以后,我们要往里边存很多数据,那你想过没有,文件名放在什么地方?文件的内容放到什么地方了?你考虑过这些问题吗?文件的名字在哪里?文件的数据又在哪里?先存有这个疑问,后面会细讲文件系统。好,但不管怎么讲,我们现在知道怎么去找一个文件路径,或者说什么是文件路径就可以了,那于是我们就能理解ls这个命令了,如下图,
那我使用ls,直接回车,不跟任何参数,也没有任何选项,没有选项就意味着它以ls的默认方式进行工作,对不对?那没有参数呢?ls就列出指定路径下的文件或者子目录的等等。那现在我没指定,怎么办?它是不是也有默认值啊?默认指的叫缺省,有的地方把它叫缺省,有的地方把它叫默认,对ls而言,默认就显示当前目录下的文件。
当前目录,那当前目录是哪个目录呀?我们有另外一个命令叫做pwd,print working directory,
或者叫printing都可以。显示工作目录,显示当前目录,所以叫pwd,那因此我们在这里执行一下pwd,如下图,
它就能显示你当前在哪个路径下,看到了吗?对linux而言,最顶级这个目录用斜线来表示,最顶级这个用斜线来表示,大家记得,而后各路径之间的分割符也使用斜线,注意,这叫斜线,Windows使用的叫反斜线,不知道Windows为什么非要标新立异,大家应该知道,有一句话叫做丑人多作怪是吧?那恐怕Windows就是这样一个思想。好,那所以像这里的这个路径就表示根目录下的root,根下面直接有个root,这是一级子目录。那因此,我们ls和ls root指的是不是同一个意思了?内容是一样的,这列出来的都是文件名称,用蓝色显示的是目录,是目录的属性,如果显示为绿色的话,通常指的是它有执行权限。当然还有很多其他颜色,常用的颜色有六种,回头会介绍以及怎么去显示颜色。好,这是ls,当然ls有很多的其他的辅助性的功能,比如说,我们可以使用很多选项来定义,比如像之前用到的 -l,其实表示就是long long,叫做长格式,长格式的意思,就表示显示完整信息,都来看我们使用-l和不使用-l有什么区别呢?如下图,
ls 只显示文件名而使用ls -l以后会显示文件的很多属性,看到了吗?这些属性我先做一个简单介绍,注意,第一列是十位,看到了吧?这是十位,最左侧这一位是文件类型,注意这个类型指的不是内容类型,而只是文件本身的属性上能够区别的类型,好,我先说一遍,回头讲文件系统再说一遍啊,文件类型对linux而言有这样几种,要记住了,如果显示为横线,就表示这是一个普通文件,就是一个常见的文件,事实上,它应该用f来表示,只不过这里使用横线来表示了,是个file。如果显示为d,这表示这是个目录文件。如果显示为b,就表示这是一个块设备文件。b就叫block,后面会讲什么是块设备,先知道就行。然后是c,这表示是一个字符设备文件,c就叫character。它还可能是l,这表示是链接文件,但是这里指的是符号链接,链接文件有两种,叫symbolic file link,
称为叫符号链接,也叫软链接文件。如果看到是p的话,这表示这是个管道文件,命名管道,把它称为叫pipe,就是烟斗那个管道。如果是s,这表示这是一个套接字文件,比如socket,先记下来就OK,回头再解释这东西是什么东西,都是什么?好,这是我们的常见文件类型,那由此来看,这里这横线表示普通文件对不对?这d就表示目录,其他的就不再解释,当然,应该知道,在dev目录下有很多设备文件,你看,如下图,
很多c开头的,看到了吧?还有l开头的,还有d开头的,c开头的,刚才说过叫字符设备,在tmp目录下,有些情况下你可能会看到s开头的文件,套接字文件,它的颜色好奇怪是吧。
好,这是ls -l杠l选项所显示内容的第一列的第一个字符,我们把它称为叫文件类型。再看后面这九个,这是九个位,这九个位表示是文件的权限,叫文件的mode,mode叫模型或者叫模式都行,实际上它指的是权限,第二个位开始叫文件权限,一共有九位,这九位里边是每三位一组,至于它们是什么,回头再说,先知道就行了,每三位一组,而且每一组里边都分别是rwx,就是读写执行三种权限。r表示读,w表示写,x表示执行,如果没有这个对应的权限,就得用横杠来表示,就表示没这个位没这个权限,比如说,写成rw-代表什么意思?能读能写,不能执行,能理解了吧?OK,那r--就表示,能读不能写,也不能执行,就表示这意思。所以每三位一组,那个位上没有的话,就用横线来表示,那由此,---就表示什么都没有,是不是?好,这九位是权限,回头再细细解释,下面这个叫做文件被硬链接的次数,是文件硬链接的次数,好,那至于这些次数为什么是一?,有的为什么是二?能不能把它增加等等,后面都会解释,现在不说了,下一列,就是第三列,是文件的所有者,文件的所有就是文件归谁所有?OK,文件的属主,也叫owner,就是拥有者。那对应下一列就是文件的属组,OK,文件的属组叫group,它属于哪个组?用户是可以有用户组的,那组和用户到底有没有用?以及什么是进程的安全上下文,后面会有解释。
好再向后,第5列,是文件大小,把它称叫size,文件的size,单位是字节,默认单位是字节,
再向后一个,第6列,这是一个,注意啊,这是个时间,或者叫时间戳,把它称为叫timestamp,
每一个文件都有三个时间戳,包括最近一次被访问的时间,最近一次被修改的时间,最近一次被改变的时间,修改和改变有区别吗?每一个文件都有三个时间戳,这里显示的是最近一次被修改的时间,对修改的时间,注意,刚才说过有三个时间戳,对吧?第一个是访问,访问很容易理解,
就是读里边内容,我们打开访问了,比方使用cat等命令,后面会有介绍,访问把它称为叫access,修改我们把它称为叫modify,而还有一个我们称为叫改变,称为叫change。修改和改变有什么区别?这个很容易理解,一个文件,它有两种数据,一种是文件自身的数据,另外一种是文件的属性数据,属性数据也叫元数据,先记住这个概念,文件的属性数据也叫元数据,叫做metadata,把它翻译成叫元数据,就这个元,表示根本的。而修改指的是改变了文件的内容,改变指的是改变了文件的属性或者叫原数据。明白了吗?很奇怪,莫非不改变文件内容,文件属性会不会修改?文件内容没有动,但是把文件名改了,属性是不是修改了?就像一个人一样,人改改名和掉了一只胳膊,那是两码事,对吗?好,这是时间戳,那由此知道,第6列是最近一次被修改,也就是它的内容发生了改变的时间,文件内容发生改变。最后一列不用解释了,这是文件名,就是文件是什么?这是-l的显示结果,再说一遍,这是常识,以后用linux,几乎每一次都有可能要用到的。好,有没有发现,当使用-l的时候,这个文件的大小像是字节对不对?事实上,有时候经常希望把它显示为单位,比方说M啊、k啊或者g啊什么之类的,更容易识别,这可以用到另外一个选项叫做 -h,h表示叫human readable,就人类容易识别的,人类可读的,那所以它说白了,就是做单换算的,默认是b,可能会把它转换成KB、Mb、gb什么之类的,那因此-l-h就可以一块来用了,我们来看ls -l -h,当然我说过可以和一起是吧?ls -lh,短选项合并,如下图,
在Windows里边,应该知道文件可以有隐藏属性的,对吗?隐藏就意味着我们平时是看不到它的,除非把它的隐藏属性给它或者把它的能够让我的目录显示的时候显示那些隐藏属性,对不对?那实际上ls也能支持常用的选项叫做-a,表示all,显示所有文件,但是对linux而言,隐藏文件是用点号开头的,隐藏文件以点号开头,那所以这里表示显示以点开头的隐藏文件。比如使用ls -a,会发现会多出来很多文件的,这些文件都是点开头的,有两个特殊的,一个叫点,一个叫点点,还有其他的以点开头的,如下图,
点和点点是什么呢?而且,发现点还是有蓝色的,是不是?我说个蓝色是什么?目录是吧?那因此点表示当前目录,那点点呢?表示当前目录的上一级目录,所以来看,用ls . 是一个效果,如下图,
看到了吧,虽然点本身没显示出来,ls . 它也表示显示当前路的。那猜一猜,ls .. 呢?显示的上级目录,上级目录是根目录,就是根目录下的所有目录,表示父目录,如下图,
如果我们使用-A来显示的话,大写的a,就表示显示所有隐藏文件,但是不包含 . 和 ..,
来看一下,点和点点就没了,如下图,
但是隐藏文件也会显示了,看到吗?这是A和a的区别。
我这里显示 ls /root,如下图,
发现它显示root目录下的内容是不是?那如果想显示root本身的属性怎么办?ls -l root,我想想看一下root这个目录自身的数据、权限、最近一次的修改时间等怎么看?有个选项叫杠d,显示目录自身属性的,比如,像刚才仍然这里,ls -ld 一块来用,就显示root自身属性了,如下图
之前说过,我们识别用户是靠用户名,而计算机是把它转换成数字来识别的,对不对?文件名也是如此,我们用户或者我们作为计算机的使用者来讲,以名字来记忆文件可能更容易,但是机器识别靠数字更简单,所以每一个文件都有一个唯一的数字标识符,这叫文件的inode,叫文件的结点,
也叫文件的索引节点,把它称为叫index node 简写为inode,那很显然,刚刚说过,既然每一个文件都有一个索引节点,它每个节点应该都有对应的号码, 有一个对应的号码,那因此我们要想显示文件的一个号码的话,就使用 -i 选项,-i 选项显示文字的索引结点号的,注意这个东西对我来讲是很关键的,如下图,
每个文件前面是不是有数字的,这叫索引结点,好,不知道大家有没有留意到,当使用ls命令的时候,你会发现这个文件是按照文件名在字母表中的次序进行排列的、连续的,看到了吗?而且是升序排序的,那使用ls -r,看效果是什么?如下图,
完全反过来了,看到了吗?好,所以小r,刚看到了,逆序显示文件,逆序显示。那大R是干什么的?叫递归显示,ls -R,如下图,
以后我们会经常用这个单词递归,叫recursive或者叫recursion都行。recursive 表示递归显示,什么叫递归啊?ls的时候,它只显示这个子目录对不对?子目录中有什么内容显示不显示?不显示的,而加-R,它不但显示子目录,每个子目录中有什么,只不过这个子目录是空的,子目录中的内容也予以显示的,如果子目录中还有子目录,子子目录中内容也会显示叫递归。当然,大家应该知道,递归是相当消耗资源的,这个要知道,比方说一个文件下面有上万个小文件,这样一递归,内存中,大量的内存都用来显示这个文件了,因为所有的数据要显示,首先要先到内存,好,-R叫递归显示。
那事实上,ls还有很多其他选项,先不说了,大致常用到的就这么多,这也是我们最最常用的命令。