笔记 鸟哥的Linux私房菜(上)

计算器就是计算器,计算器的定义:接受用户输入烦人指令与数据,经由中央处理的函数与逻辑单元运算处理后,以产生或存储有用的信息。也就是说只要是能让你输入数据(键盘,触摸屏),
并产生输出的(打印机打印,屏幕打印)的机器就是计算器。

计算机概论

计算机硬件的五大元件

  • 输入单元,键盘鼠标等。
  • 输出单元,屏幕或者打印机等。
  • CPU内部的控制单元
  • CPU内部的算数逻辑单元
  • 主存储器

主机中最重要的就是主板。上面插了CPU,主存储器,硬盘等,智能手机是直接焊上去的。

CPU 是一个具有特定功能的芯片,里头含有微指令集。CPU的主要工作在于管理和运算,因此在CPU内又分为两个主要烦人单元:算数逻辑单元控制单元。算数逻辑单元主要负责程序运算
与逻辑判断,控制单元主要负责协调周边组件和各单元间的工作。

为什么通常加大内存容量就可以提搞系统运行速度?

因为CPU读取的数据是从主存储器来的,主存储器内的数据是从输入单元所传输进来的。而CPU处理完的数据也必须写回主存储器中,最后数据从主存储器传输到输出单元。CPU实际处理的资料(程序或者文件数据)
完全来自于主存储器。

CPU架构

CPU内部有微指令集,这些指令集的设计分为两种,这是常见的两种CPU架构:精简指令集(RISC)和复杂指令集(CISC)系统

微指令集每个指令的运行时间都很短,执行效能佳,但是如果要做复杂的事情,就要多个指令完成。典型的RISC CPU就是 安谋公司的 ARM CPU系列。

复杂指令集的指令可以执行一些较低阶的硬件操作,指令多而且复杂,每条指令的长度并不相同。指令由于复杂所以执行的时间较长。典型的就是 AMD,Interl等x86架构的CPU。

那么 32位,64位代表了什么?
所谓的位指的是CPU一次读取的最大量。64位CPU代表一次可以读写64 bits的数据。因为CPU读取数据量有限,因此能够从内存中读写的数据也就有所限制。一般32位CPU最大读写的数据量是4GB左右。

不同的x86 CPU有什么区别?

主要是在于微指令集的不同。新的x86有先进的微指令集,可以加速多媒体程序的运作,也可以加强虚拟化的效能,某些微指令还能减低耗电量。

其他单元设备

在主机内的设备大多是通过主板连接在一块,主板上有连接所有设备的芯片组,这个芯片组连接所有单元设备,好让CPU可以对这些设备下达命令。其他重要的设备主要有:

  • 系统单元,系统单元包括CPU以及内存,主板相关组件。主板还连接很多界面,适配卡(网络卡,显示适配器等)。
  • 记忆单元,主存储器(main memory,RAM)与辅助内存(包括硬盘,软盘,光盘,磁带等)。
  • 输入输出单元,键盘鼠标,打印机,投影机等。

计算机上面的计算单位

容量单位

计算机只认识0和1.0/1这个二进制单位叫做bit。8个bits是一个byte。

速度单位

CPU的指令这周期使用MHz或者GHzHz就是秒分之一。

Mbps=Mbit/s即兆比特每秒。Million bits per second的缩写。1Mbps代表每秒传输1,048,576位,即每秒传输的数据量为: 1,048,576/8=128K字节/秒=131072字节/秒

个人计算机

多核指的是在一颗CPU嵌入的两个以上的运算核心。

CPU的效能除了微指令集会影响,还有频率。频率就是CPU每秒钟可以进行的工作次数。频率越高代表单位时间内可以做更多的事情。例如,Intel的 i7-4790 频率为3.6GHz,表示这个CPU
一秒内可以进行3.6*10的九次方次工作。

CPU的工作频率:外频与倍频

早期的CPU设计中,所谓的外频指的是CPU与外部组件进行数据传输时的速度,倍率指的是CPU内部用来加速工作效能的一个倍数,两者相乘才是CPU的频率速度。例如,一个CPU的内频为 3.0GHz,
外频是 333MHz,那么倍频就是 9倍了(3.0G=333M*9)。

新的CPU设计中,将内存控制器整合到CPU内部,没有了所谓的北桥。

32位和64位 CPU 与总线[宽度]

我们已经知道主存储器提供的数据量越大,系统效能越快。如何知道主存储器可以提供的数据量?

所谓的系统总线频宽则是:『FSBx系统总线宽度』亦即每秒钟可传送的最大数据量。 目前常见的系统总线宽度有32/64位(bits)。

例如,前端系统总线最高速度可达1600MHz。 我们看到内存与北桥的频宽为12.8GBytes/s,亦即是1600MHz64bits = 1600MHz8Bytes = 12800MByes/s = 12.8GBytes/s

CPU每次能够处理的数据量称为字长大小(word size), 字长大小依据CPU的设计而有32位与64位。我们现在所称的计算机是32或64位主要是依据这个 CPU解析的字长大小而来的

内存

一般主板上会有主内存的插槽,前面提到CPU所使用的数据都是来自於主内存(main memory),不论是软件程序还是数据,都必须要读入主内存后CPU才能利用。

个人计算机的主内存主要组件为动态随机访问内存(Dynamic Random Access Memory, DRAM), 随机访问内存只有在通电时才能记录与使用,断电后数据就消失了。因此我们也称这种RAM为挥发性內存

主内存除了频率/频宽与型号需要考虑之外,內存的容量也是很重要! 因为所有的数据都得要载入內存当中才能够被CPU判读,如果內存容量不够大的话将会导致某些大容量数据无法被完整的载入,
此时已存在內存当中但暂时没有被使用到的数据必须要先被释放,使得可用内存容量大於该数据,那份新数据才能够被载入!所以,通常越大的内存代表越快速的系统,这是因为系统不用常常释放一些内存内部的数据。
以服务器来说,主内存的容量有时比CPU的速度还要来的重要的

DRAM与SRAM

除了主内存之外,事实上整部个人计算机当中还有许许多多的内存存在。最为我们所知的就是CPU内的第二层缓存内存。

我们现在知道CPU的数据都是由主内存提供,但主内存的数据毕竟得经由北桥送到CPU内。 如果某些很常用的程序或数据可以放置到CPU内部的话,那么CPU数据的读取就不需要透过北桥!
大大的提升效能。这就是第二层缓存的设计概念。

因为第二层缓存(L2 cache)整合到CPU内部,因此这个L2内存的速度必须要CPU频率相同。使用DRAM是无法达到这个频率速度的,此时就需要静态随机访问内存(Static Random Access Memory, SRAM)

只读内存(ROM)

BIOS对於个人计算机来说是非常重要的, 因为他是系统在开机的时候首先会去读取的一个小程序。

BIOS(Basic Input Output System)这套程序是写死到主机板上面的一个内存芯片中, 这个内存芯片在没有通电时也能够将数据记录下来,那就是只读内存(Read Only Memory, ROM)。
ROM是一种非挥发性的内存

显示卡

假设你的桌面使用1024x768解析度,且使用全彩(每个像素占用3bytes的容量),请问你的显示卡至少需要多少内存才能使用这样的彩度?

因为1024x768解析度中会有786432个像素,每个像素占用3bytes,所以总共需要2.25MBytes以上才行! 但如果考虑萤幕的更新率(每秒钟萤幕的更新次数),显示卡的内存还是越大越好!

硬盘与储存设备

计算机总是需要记录与读取数据的,所以就需要有储存设备。包括有:硬盘、软盘、MO、CD、DVD、磁带机、随身碟(快闪内存)、还有新一代的蓝光光驱等,乃至於大型机器的区域网络储存设备(SAN, NAS)等等,
都是可以用来储存数据的。最常见的应该就是硬盘。

数据表示方式

计算机只认识0与1,记录的数据也是只能记录0与1而已,所以计算机常用的数据是二进位的

但是我们常用的数值运算是十进制,文字方面则有非常多的语言,台湾常用的语言就有英文、中文(又分正体与简体中文)、日文等。 那么电脑如何记录与显示这些数值/文字呢?就得要通过一系列的转换才可以啦!

数字系统

所谓的十进制指的是逢十进一位, 因此在个位数归为零而十位数写成1。所以所谓的二进制,就是逢二就前进一位的意思

文字编码系统

电脑都只有记录0/1而已,甚至记录的数据都是使用Byte/bit等单位来记录的,那么文字该如何记录?

事实上文字文件也是被记录为0与1而已,而这个文件的内容要被取出来查阅时,必须要经过一个编码系统的处理才行。 所谓的“编码系统”可以想成是一个“字码对照表”。

当我们要写入文件的文字数据时,该文字数据会由编码对照表将该文字转成数字后,再存入文件当中。 同样的,当我们要将文件内容的数据读出时,也会经过编码对照表将该数字转成对应的文字后,再显示到屏幕上。
这也就是为什么浏览器上面如果编码写错时,会出现乱码?这是因为编码对照表写错,导致对照的文字产生误差。

常用的英文编码表为ASCII系统。这个系统每个字符占用1个字节,也就是8位,也就是说会有256种变化。中文早期使用big5编码表,每个中文字占用2个字节,理论上可以表示65536个文字,但实际上只有一万三千
多个文字,还是有很多问题,于是出现了 Unicode编码。我们常用的UTF-8就是这个。

软件程序运行

电脑系统软件分为两类:系统软件和应用程序。

机器程序和编译程序

电脑只认识0和1,而且电脑的运算和逻辑判断是在CPU内部,CPU又有微指令集,所以当我们需要CPU时,就需要写可以让CPU读的懂得指令码。

这就很麻烦了:

  • 需要了解机器语言。
  • 需要了解所有硬件的相关功能函数。
  • 每个电脑的CPU不同,微指令集可能也不同,所以A电脑的程序可能在B电脑上不能运行。
  • 程序具有专一性,不同的程序需要从头再写一遍。

于是,为了解决上面的问题,出现了人类可以读懂的计算机语言(C,C++,Java等),再创造“编译器”将这种语言转译成机器可读的机器码。

但是还需要解决硬件方面老是需要重复编写控制码的问题,于是出现了操作系统(Operating System, OS)。

操作系统

在早期想要让电脑执行程序就得要参考一堆硬件功能函数,并且学习机器语言才能够撰写程序。 同时每次写程序时都必须要重新改写,因为硬件与软件功能不见得都一致之故。那如果我能够将所有的硬件都驱动,
并且提供一个发展软件的参考接口来给工程师开发软件的话,那发展软件不就变的非常的简单了?这就是操作系统。

操作系统(Operating System, OS)其实也是一组程序, 这组程序的重点在于管理电脑的所有活动以及驱动系统中的所有硬件。操作系统的功能就是让CPU可以开始判断逻辑与运算数值、 让内存可以开始
载入/读出数据与程序码、让硬盘可以开始被存取、让网卡可以开始传输数据、 让所有周边可以开始运行等等。

上述的功能就是操作系统的核心(Kernel)了。只有核心有提供的功能,你的电脑系统才能帮你完成!举例来说,你的核心并不支持TCP/IP的网络协定, 那么无论你购买了什么样的网卡,这个核心
都无法提供网络能力的。

有了核心,就需要软件来操作系统,果我想要开发软件的话,自然就得要去参考这个核心的相关功能!如此一来不是从原本的参考硬件函数变成参考核心功能,还是很麻烦。

为了解决这个问题,操作系统通常会提供一整组的开发接口给工程师来开发软件。工程师只要遵守该开发接口那就很容易开发软件了。例如,我们学习C程序语言只要参考C程序语言的函数即可,不需要再去考虑其
他核心的相关功能,因为核心的系统调用接口会主动的将C程序语言的相关语法转成核心可以了解的任务函数,核心自然就能够顺利运行该程序了。

  • 操作系统的核心层直接参考硬件规格写成, 所以同一个操作系统程序不能够在不一样的硬件架构下运行。举例来说,个人电脑版的Windows 8.1 不能直接在 ARM 架构 (手机与平板硬件) 的电脑下运行。
  • 操作系统只是在管理整个硬件资源,包括CPU、内存、输入输出设备及文件系统文件。 如果没有其他的应用程序辅助,操作系统只能让电脑主机准备妥当(Ready)而已!并无法运行其他功能。

操作系统的核心要有这些功能:

  • 系统调用接口(System call interface) 刚刚谈过了,这是为了方便程序开发者可以轻易的通过与核心的沟通,将硬件的资源进一步的利用, 于是需要有这个简易的接口来方便程序开发者。
  • 程序管理(Process control) 总有听过所谓的“多任务环境”吧?一部电脑可能同时间有很多的工作跑到CPU等待运算处理, 核心这个时候必须要能够控制这些工作,让CPU的资源作有效的分配才行!
    另外, 良好的CPU调度机制(就是CPU先运行那个工作的排列顺序)将会有效的加快整体系统性能。
  • 内存管理(Memory management) 控制整个系统的内存管理,这个内存控制是非常重要的,因为系统所有的程序码与数据都必须要先存放在内存当中。 通常核心会提供虚拟内存的功能,当内存不足时可以
    提供内存交换(swap)的功能。
  • 文件系统管理(Filesystem management) 文件系统的管理,例如数据的输入输出(I/O)等等的工作!还有不同文件格式的支持等等,如果你的核心不认识某个文件系统,那么将无法使用该文件格式的文件!
    例如:Windows 98就不认识NTFS文件格式的硬盘;
  • 设备的驱动(Device drivers) 就如同上面提到的,硬件的管理是核心的主要工作之一,设备的驱动程序就是核心需要做的事情!好在目前都有所谓的“可载入模块”功能,可以将驱动程序编辑成模块,
    就不需要重新的编译核心。

驱动程序的提供应该是硬件厂商的事情,硬件厂商要推出硬件时,应该要自行参考操作系统的驱动程序开发接口,开发完毕后将该驱动程序连同硬件一同贩卖给使用者。举例来说,当你购买显卡时,
显卡包装盒都会附上一片光盘,让你可以在进入Windows之后进行驱动程序的安装。

驱动程序可以说是操作系统里面相当重要的一环,硬件是持续在进步当中,那么比较晚推出的较新的硬件,例如显卡,我们的操作系统当然就不认识了,那操作系统该如何驱动这块新的显卡?为了克服这
个问题,操作系统通常会提供一个开发接口给硬件开发商, 让他们可以根据这个接口设计可以驱动他们硬件的“驱动程序”,如此一来,只要使用者安装驱动程序后, 自然就可以在他们的操作系统上面驱动这块显卡了。

驱动程序仍然是依据操作系统而开发的, 所以,给Windows用的驱动程序当然不能使用于Linux的环境下了。

Linux是什么

Linux是什么?操作系统/应用程序?

操作系统除了有效率的控制这些硬件资源的分配,并提供计算机运行所需要的功能(如网络功能)之外, 为了要提供程序设计师更容易开发软件的环境,所以操作系统也会提供一整组系统调用接口来给软件设计师开发用。

Linux就是一套操作系统。
由于不同的硬件他的功能函数并不相同,例如IBM的Power CPU与Intel的x86架构就是不一样! 所以同一套操作系统是无法在不同的硬件平台上面运行的。

如果能够参考硬件的功能函数并据以修改你的操作系统程序码,那经过改版后的操作系统就能够在另一个硬件平台上面运行了。这个动作我们通常就称为“软件移植”了

请问Windows操作系统能否在苹果公司的MAC计算机上面安装与运行?

在2006年以后,苹果计算机转而请Intel设计其硬件架构,亦即其硬件架构已经转为x86系统, 因此在2006年以后的苹果计算机若使用x86架构时,其硬件则“可能”可以安装Windows操作系统了。

Linux由于是Open Source的操作系统,所以他的程序码可以被修改成适合在各种机器上面运行的, 也就是说,Linux是具有“可移植性”,这是很重要的一个功能。

Linux当前应用

  • 网络服务器
  • 关键任务的应用(金融数据库、大型企业网管环境)
  • 学术机构的高性能运算任务
  • 桌面电脑
  • 手持系统(手机),Android 其实就是 Linux 核心的一支,只是专门用来针对手机/平板这类的 ARM 机器所设计的
  • 嵌入式系统,硬件系统除了我们常看到的计算机之外, 其实家电产品、PDA、手机、数码相机以及其他微型的计算机配备也是硬件系统啦! 这些计算机配备也都是需要操作系统来控制的!
    而操作系统是直接嵌入于产品当中的,理论上你不应该会更动到这个操作系统, 所以就称为嵌入式系统。包括路由器、防火墙、手机、IP分享器、交换器、机器人控制芯片、家电用品的微计算机控制器等等,
    都可以是Linux操作系统。
  • 云程序

主机规划与磁盘分区

Linux系统是安装在计算机的磁盘上的。磁盘可以被分成多个分区(partition),以旧有的Windows观点来看,你可能会有一颗磁盘并且将他分区成为C:, D:, E:盘对吧!那个C, D, E就是分区(partition)。
但是Linux的设备都是以文件的型态存在,那分区的文件名又是什么? 如何进行磁盘分区?磁盘分区有哪些限制?

磁盘分区

个人计算机常见的磁盘接口有两种, 分别是SATA与SAS接口。

正常的实体机器大概使用的都是/dev/sd[a-]的磁盘文件名,至于虚拟机环境下面,为了加速,可能就会使用/dev/vd[a-p]这种设备文件名。

由于SATA/USB/SAS等磁盘接口都是使用SCSI模块来驱动的, 因此这些接口的磁盘设备文件名都是/dev/sd[a-p]的格式。 所以SATA/USB接口的磁盘根本就没有一定的顺序,那如何决定他的设备文件名呢?
这个时候就得要根据Linux核心侦测到磁盘的顺序了。

如果你的PC上面有两个SATA磁盘以及一个USB磁盘,而主板上面有六个SATA的插槽。这两个SATA磁盘分别安插在主板上的SATA1, SATA5插槽上, 请问这三个磁盘在Linux中的设备文件名为何?

由于是使用侦测到的顺序来决定设备文件名,并非与实际插槽代号有关,因此设备的文件名如下:

  1. SATA1插槽上的文件名:/dev/sda
  2. SATA5插槽上的文件名:/dev/sdb
  3. USB磁盘(开机完成后才被系统捉到):/dev/sdc

磁盘分区的选择

Linux内的所有数据都是以文件的形态来呈现的,所以整个Linux系统最重要的地方就是在于目录树架构。

所谓的目录树架构(directory tree)就是以根目录为主,然后向下呈现分支状的目录结构的一种文件架构。 所以,整个目录树架构最重要的就是那个根目录(root directory),这个根目录的表示方法为一条斜线“/”,
所有的文件都与目录树有关。目录树的呈现方式如下图所示:

所有的文件都是由根目录(/)衍生来的,而次目录之下还能够有其他的数据存在。

我们现在知道整个Linux系统使用的是目录树架构,但是我们的文件数据其实是放置在磁盘分区当中的, 现在的问题是“如何结合目录树的架构与磁盘内的数据”呢? 这个时候就牵扯到挂载(mount)的问题了。

所谓的“挂载”就是利用一个目录当成进入点,将磁盘分区的数据放置在该目录下;也就是说,进入该目录就可以读取该分区的意思。这个动作我们称为“挂载”,那个进入点的目录我们称为挂载点
由于整个Linux系统最重要的是根目录,因此根目录一定需要挂载到某个分区的。 至于其他的目录则可依使用者自己的需求来给予挂载到不同的分区。我们以下图来作为一个说明:

partition 1是挂载到根目录,至于partition 2则是挂载到/home这个目录。 这也就是说,当我的数据放置在/home内的各次目录时,数据是放置到partition 2的,如果不是放在/home下面的目录,
那么数据就会被放置到partition 1了。

计算机系统如何读取光盘内的数据呢?在Windows里面使用的是“光驱”的代号方式处理(假设为E盘时),在默认的情况下,Linux是将光驱的数据放置到/media/cdrom里头去的。 如果光盘片里面有个文件
文件名为“我的文件”时,那么这个文件是在哪里?答:这个文件最终会在如下的完整文件名中:

  • Windows: 桌面\我的计算机\E:\我的文件
  • Linux: /media/cdrom/我的文件

如果光驱并非被挂载到/media/cdrom,而是挂载到/mnt这个目录时,刚刚读取的这个文件的文件名会变成:

  • /mnt/我的文件

Linux系统下使用的是目录树系统,所以安装的时候自然就得要规划磁盘分区与目录树的挂载了.

实际上,在Linux安装的时候已经提供了相当多的默认模式让你选择分区的方式了,建议使用自定义安装模式。

  • 初次接触Linux:只要分区/swap即可,这样作有个好处,就是不怕分区错误造成无法安装的困境!例如/usr是Linux的可执行程序及相关的文件摆放的目录, 所以他的容量需求蛮大的,万一你分区了一块分
    区给/usr,但是却给的不够大,会造成无法将数据完全写入的问题,就有可能会无法安装啦!因此如果你是初次安装的话,那么可以仅分区成两个分区/swap即可。
  • 建议分区的方法:预留一个备用的剩余磁盘容量。

主机硬盘的主要规划

基本硬盘分区的模式:

  • 上面提到的只要分区/swap即可。
  • 较麻烦一点的分区方式就是先分析这部主机的未来用途,然后根据用途去分析需要较大容量的目录, 以及读写较为频繁的目录,将这些重要的目录分别独立出来而不与根目录放在一起, 那当这些读写较频繁的磁盘分区
    有问题时,至少不会影响到根目录的系统数据,那挽救方面就比较容易。在默认的CentOS环境中,下面的目录是比较符合容量大且(或)读写频繁的目录:
    • /boot
    • /
    • /home
    • /var
    • Swap

Linux 的文件权限与目录配置

Linux一般将文件可存取的身份分为三个类别,分别是owner/group/others,且三种身份各有read/write/execute等权限

使用者与群组

文件拥有者

由于Linux是个多用户多任务的系统,因此可能常常会有多人同时使用这部主机来进行工作的情况发生, 为了考虑每个人的隐私权以及每个人喜好的工作环境,因此,这个“文件拥有者”的角色就显的相当的重要了。

例如当你将你的e-mail情书转存成文件之后,放在你自己的主文件夹,你总不希望被其他人看见自己的情书吧?这个时候,你就把该文件设置成“只有文件拥有者,就是我,才能看与修改这个文件的内容”,
那么即使其他人知道你有这个相当“有趣”的文件,不过由于你有设置适当的权限, 所以其他人自然也就无法知道该文件的内容!

群组

群组最有用的功能之一,就是当你在团队开发资源的时候。可以经由简易的文件权限设置,就能限制非自己团队(亦即是群组) 的其他人不能够阅览内容,亦可以让自己的团队成员可以修改我所创建的文件。
同时,如果我自己还有私人隐密的文件,仍然可以设置成让自己的团队成员也看不到我的文件数据。

另外,每个帐号都可以有多个群组的支持。

其他人

也就是群组外的人。Linux中还有一个超级用户rootroot用户可以访问所有文件。

Linux文件权限的概念

你有没有碰到过Permission deny,很明显这是权限设置错误了。

Linux文件属性

使用ls命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@study ~]# ls -al
total 48
dr-xr-x---. 5 root root 4096 May 29 16:08 .
dr-xr-xr-x. 17 root root 4096 May 4 17:56 ..
-rw-------. 1 root root 1816 May 4 17:57 anaconda-ks.cfg
-rw-------. 1 root root 927 Jun 2 11:27 .bash_history
-rw-r--r--. 1 root root 18 Dec 29 2013 .bash_logout
-rw-r--r--. 1 root root 176 Dec 29 2013 .bash_profile
-rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc
drwxr-xr-x. 3 root root 17 May 6 00:14 .config <=范例说明处
drwx------. 3 root root 24 May 4 17:59 .dbus
-rw-r--r--. 1 root root 1864 May 4 18:01 initial-setup-ks.cfg <=范例说明处
[ 1 ][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ] [ 7 ]
[ 权限 ][链接][拥有者][群组][文件大小][ 修改日期 ] [ 文件名 ]

上面的权限一栏有十个字符:

  • 第一个字符代表这个文件是“目录、文件或链接文件等等”:
    • 当为d则是目录,例如上表文件名为.config的那一行
    • -则是文件
    • l(link file)则表示为链接文件
    • b则表示为设备文件里面的可供储存的周边设备(可随机存取设备)
    • c则表示为设备文件里面的序列埠设备,例如键盘、鼠标(一次性读取设备)
  • 接下来的字符中,以三个为一组,且均为rwx的三个参数的组合。r代表可读,w代表可写,x代表可执行。如果没有权限,就会出现-
  • 第二栏表示有多少文件名链接到此节点(i-node)。
  • 第三栏表示这个文件(或目录)的“拥有者帐号”。
  • 第四栏表示这个文件的所属群组。
  • 第五栏为这个文件的容量大小,默认单位为Bytes。
  • 第六栏为这个文件的创建日期或者是最近的修改日期。

Linux文件权限的重要性

最大的用途是在“数据安全性”上面的。

  • 系统保护的功能,例如,关于系统服务的文件通常只有root才能读写或者是执行,例如/etc/shadow这一个帐号管理的文件,由于该文件记录了你系统中所有帐号的数据,
    因此是很重要的一个配置文件,当然不能让任何人读取(否则密码会被窃取啊),只有root才能够来读取。
  • 团队开发软件或数据共享的功能。
  • 未将权限设置妥当的危害,如果你的目录权限没有作好的话,可能造成其他人都可以在你的系统上面乱搞!例如本来只有root才能做的开关机、ADSL的拨接程序、新增或删除使用者等等的指令,
    若被你改成任何人都可以执行的话,那么如果使用者不小心给你重新开机。

如何改变文件属性与权限

  • chgrp:改变文件所属群组
  • chown:改变文件拥有者
  • chmod:改变文件的权限, SUID, SGID, SBIT等等的特性
  1. chgrp
    1
    2
    3
    4
    5
    chgrp [-R] dirname/filename ...
    选项与参数:
    -R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有文件、目录
    都更新成为这个群组之意。常常用在变更某一目录内所有的文件之情况。

要被改变的群组名称必须要在/etc/group文件内存在才行,否则就会显示错误。

  1. chown

    1
    2
    3
    4
    5
    6
    7
    8
    # 修改拥有者
    chown [-R] 帐号名称 文件或目录
    # 修改拥有者和群组
    chown [-R] 帐号名称:群组名称 文件或目录
    选项与参数:
    -R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有文件都变更
  2. chmod
    数字类型改变文件权限,文件的权限字符为:“-rwxrwxrwx”, 这九个权限是三个三个一组的,我们可以使用数字来代表各个权限,各权限的分数对照表:r:4 > w:2 > x:1

    1
    2
    3
    4
    chmod [-R] xyz 文件或目录
    选项与参数:
    xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加,xyz表示三组权限。
    -R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有文件都会变更

符号类型改变文件权限,可以借由u, g, o来代表三种身份的权限。此外,a则代表all亦即全部的身份。读写的权限就可以写成r, w, x

1
chmod u=rwx,go=rx .bashrc

Linux文件种类与扩展名

文件种类:

  • -表示正规文件(regular file ): 就是一般我们在进行存取的类型的文件,按照文件内容又可以分为:
    • 纯文本文件(ASCII):这是Linux系统中最多的一种文件类型。
    • 二进制文件(binary):指令cat就是一个binary file
    • 数据格式文件(data): 有些程序在运行的过程当中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件 (data file)。例如,
      我们的Linux在使用者登陆时,都会将登录的数据记录在/var/log/wtmp那个文件内,该文件是一个data file。
  • d表示目录(directory)。
  • l表示连接文件(link):类似Windows系统下面的捷径。
  • 设备与设备文件(device):与系统周边及储存等相关的一些文件, 通常都集中在/dev这个目录之下!通常又分为两种:
    • b表示区块(block)设备文件:就是一些储存数据,以提供系统随机存取的周边设备,举例来说,硬盘与软盘等。
    • c表示字符(character)设备文件:亦即是一些序列埠的周边设备, 例如键盘、鼠标等。
  • s表示数据接口文件(sockets):既然被称为数据接口文件, 想当然尔,这种类型的文件通常被用在网络上的数据承接了。
  • p表示数据输送档(FIFO, pipe):FIFO也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个文件所造成的错误问题。 FIFO是first-in-first-out的缩写。

设备文件是我们系统中很重要的文件,最好不要随意修改。

比较有趣的文件就是链接文件。如果你常常将应用程序捉到桌面来的话,你就应该知道在 Windows下面有所谓的“捷径”。同样的,你可以将 linux下的链接文件简单的视为一个文件或目录的捷径。

Linux目录配置

Filesystem Hierarchy Standard (FHS)标准对目录树架构仅定义出三层目录下面应该放置什么数据而已,分别是下面这三个目录的定义:

  • /(root, 根目录):与开机系统有关
  • /usr(unix software resource):与软件安装/执行有关
  • /var(variable):与系统运行过程有关

根目录

根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的,同时根目录也与开机/还原/系统修复等动作有关。 由于系统开机时需要特定的开机软件、核心文件、开机所需
程序、函数库等等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。

所以在FHS的要求方面,他希望根目录不要放在非常大的分区内, 因为越大的分区你会放入越多的数据,如此一来根目录所在分区就可能会有较多发生错误的机会

FHS标准建议:根目录(/)所在分区应该越小越好, 且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好。 如此不但性能较佳,根目录所在的文件系统也较不容易发生问题

目录 应放置文件内容
第一部份:FHS 要求必须要存在的目录
/bin 系统有很多放置可执行文件的目录,但/bin比较特殊。因为/bin放置的是在单人维护模式下还能够被操作的指令。 在/bin下面的指令可以被root与一般帐号所使用,主要有:cat, chmod, chown, date, mv, mkdir, cp, bash等等常用的指令。
/boot 这个目录主要在放置开机会使用到的文件,包括Linux核心文件以及开机菜单与开机所需配置文件等等。
/dev 在Linux系统上,任何设备与周边设备都是以文件的型态存在于这个目录当中的。你只要通过存取这个目录下面的某个文件,就等于存取某个设备。比要重要的文件有/dev/null, /dev/zero, /dev/tty, /dev/loop等等。
/etc 系统主要的配置文件几乎都放置在这个目录内,例如人员的帐号密码档、各种服务的启始档等等。一般来说,这个目录下的各文件属性是可以让一般使用者查阅的, 但是只有root有权力修改。FHS建议不要放置可可执行文件(binary)在这个目录中。
/lib 系统的函数库非常的多,而/lib放置的则是在开机时会用到的函数库,以及在/bin/sbin下面的指令会调用的函数库。FSH 还要求下面的目录必须要存在:/lib/modules/:这个目录主要放置可抽换式的核心相关模块(驱动程序)。
/media media是“媒体”的英文,这个/media下面放置的就是可移除的设备!包括软盘、光盘、DVD等等设备都暂时挂载于此。常见的文件名有:/media/floppy, /media/cdrom等等。
/mnt 如果你想要暂时挂载某些额外的设备,一般建议你可以放置到这个目录中。在早期,这个目录的用途与/media相同!只是有了/media之后,这个目录就用来暂时挂载用了。
/opt 这个是给第三方协力软件放置的目录。什么是第三方协力软件?举例来说,KDE这个桌面管理系统是一个独立的计划,不过他可以安装到Linux系统中,因此KDE的软件就建议放置到此目录下了。另外,如果你想要自行安装额外的软件(非原本的distribution提供的),那么也能够将你的软件安装到这里来。不过,以前的Linux系统中,我们还是习惯放置在/usr/local目录下。
/run 早期的 FHS 规定系统开机后所产生的各项信息应该要放置到/var/run目录下,新版的 FHS 则规范到/run下面。 由于/run可以使用内存来仿真,因此性能上会好很多。
/sbin 只有root才能够利用来“设置”系统的指令,其他使用者最多只能用来“查询”而已。放在/sbin下面的为开机过程中所需要的,里面包括了开机、修复、还原系统所需要的指令。至于某些服务器软件程序,一般则放置到/usr/sbin/当中。至于本机自行安装的软件所产生的系统可执行文件(system binary),则放置到/usr/local/sbin/当中了。常见的指令包括:fdisk, fsck, ifconfig, mkfs等等。
/srv “service”的缩写,是一些网络服务启动之后,这些服务所需要取用的数据目录。常见的服务例如WWW, FTP等等。举例来说,WWW服务器需要的网页数据就可以放置在/srv/www/里面。不过,系统的服务数据如果尚未要提供给网际网络任何人浏览的话,默认还是建议放置到/var/lib下面即可。
/tmp 这是让一般使用者或者是正在执行的程序暂时放置文件的地方。这个目录是任何人都能够存取的,所以你需要定期的清理一下。
/usr
/var
第二部份:FHS 建议可以存在的目录
/home 这是系统默认的使用者主文件夹。在新增一个一般使用者帐号时,默认的使用者主文件夹都会规范到这里来。比较重要的是,主文件夹有两种代号:~:代表目前这个使用者的主文件夹,~dmtsai:则代表dmtsai的主文件夹
/lib<qual> 用来存放与/lib不同的格式的二进制函数库,例如支持 64 位的/lib64函数库等。
/root 系统管理员(root)的主文件夹。之所以放在这里,是因为如果进入单人维护模式而仅挂载根目录时, 该目录就能够拥有root的主文件夹,所以我们会希望root的主文件夹与根目录放置在同一个分区中。

下面是几个在Linux当中也是非常重要的目录:

目录 应放置文件内容
/lost+found 这个目录是使用标准的ext2/ext3/ext4文件系统格式才会产生的一个目录,目的在于当文件系统发生错误时, 将一些遗失的片段放置到这个目录下。不过如果使用的是 xfs 文件系统的话,就不会存在这个目录了。
/proc 这个目录本身是一个“虚拟文件系统(virtual filesystem)”。他放置的数据都是在内存当中,例如系统核心、行程信息(process)、周边设备的状态及网络状态等等。因为这个目录下的数据都是在内存当中,所以本身不占任何硬盘空间。
/sys 这个目录其实跟/proc非常类似,也是一个虚拟的文件系统,主要也是记录核心与系统硬件信息较相关的信息。包括目前已载入的核心模块与核心侦测到的硬件设备信息等等。这个目录同样不占硬盘容量。

/usr目录

/usr里面放置的数据属于可分享的与不可变动的(shareable, static), 如果你知道如何通过网络进行分区的挂载(例如NFS服务器)。

注意usr不是user,是 unix software resource的缩写。

所有系统默认的软件(distribution发布者提供的软件)都会放置到/usr下面,因此这个目录有点类似Windows 系统的“C:\Windows\ (当中的一部份) + C:\Program files\”这两个目录的综合体,
系统刚安装完毕时,这个目录会占用最多的硬盘容量。/usr的次目录建议有下面这些:
| 目录 | 应放置文件内容 |
| ——– | —– |
| 第一部份:FHS 要求必须要存在的目录 | |
| /usr/bin/ | 所有一般用户能够使用的指令都放在这里!目前新的 CentOS 7 已经将全部的使用者指令放置于此,而使用链接文件的方式将/bin链接至此。也就是说,/usr/bin/bin是一模一样的!另外,FHS 要求在此目录下不应该有子目录。 |
| /usr/lib/ | 基本上,与 /lib 功能相同,所以 /lib 就是链接到此目录中的。 |
| /usr/local/ | 系统管理员在本机自行安装自己下载的软件(非distribution默认提供者),建议安装到此目录, 这样会比较便于管理。 |
| /usr/sbin/ | 非系统正常运行所需要的系统指令。最常见的就是某些网络服务器软件的服务指令(daemon)!不过基本功能与/sbin也差不多,因此目前/sbin就是链接到此目录中的。 |
| /usr/share/ | 主要放置只读架构的数据文件,当然也包括共享文件。 |

/var目录

/usr是安装时会占用较大硬盘容量的目录,/var就是在系统运行后才会渐渐占用硬盘容量的目录。因为/var目录主要针对常态性变动的文件,包括高速缓存(cache)、登录文件(log file)以及某些软件运行
所产生的文件, 包括程序文件(lock file, run file),或者例如MySQL数据库的文件等等。

目录 应放置文件内容
第一部份:FHS 要求必须要存在的目录
/var/cache/ 应用程序本身运行过程中会产生的一些暂存盘。
/var/lib/ 程序本身执行的过程中,需要使用到的数据文件放置的目录。在此目录下各自的软件应该要有各自的目录。例如,MySQL的数据库放置到/var/lib/mysql/而rpm的数据库则放到/var/lib/rpm去。
/var/lock/ 某些设备或者是文件资源一次只能被一个应用程序所使用,如果同时有两个程序使用该设备时, 就可能产生一些错误的状况,因此就得要将该设备上锁(lock),以确保该设备只会给单一软件所使用。 。
/var/log/ 重要,这是登录文件放置的目录!里面比较重要的文件如/var/log/messages, /var/log/wtmp(记录登陆者的信息)等。
/var/run/ 某些程序或者是服务启动后,会将他们的PID放置在这个目录下。与/run相同,这个目录链接到/run去。
/var/mail/ 放置个人电子邮件信箱的目录,不过这个目录也被放置到/var/spool/mail/目录中。通常这两个目录是互为链接文件。
/var/spool/ 放置一些排队等待其他程序使用的数据。这些数据被使用后通常都会被删除。例如,工作调度数据(crontab),就会被放置到/var/spool/cron/目录。

CentOS 7 在目录的编排上与过去的版本不同,比较大的差异在于将许多原本应该要在根目录/里面的目录,将他内部数据全部挪到/usr里面去,然后进行链接设置,例如/bin --> /usr/bin

目录树

在Linux下面,所有的文件与目录都是由根目录开始的。然后再一个一个的分支下来,有点像是树枝状,因此叫做目录树,这个目录树有什么特性?

  • 目录树的启始点为根目录
  • 每一个目录不止能使用本地端的partition的文件系统,也可以使用网络上的filesystem。举例来说,可以利用NFS服务器挂载某特定目录等。
  • 每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的

绝对路径与相对路径

根据文件名
写法的不同,也可将所谓的路径(path)定义为绝对路径(absolute)与相对路径(relative):

  • 绝对路径:由根目录(/)开始写起的文件名或目录名称,例如/home/dmtsai/.bashrc
  • 相对路径:相对于目前路径的文件名写法。例如./home/dmtsai../../home/dmtsai/等等。反正开头不是/就属于相对路径的写法

Linux文件与目录管理

常见的处理目录的指令:

  • cd:变换目录
  • pwd:显示目前的目录
  • mkdir:创建一个新的目录
  • rmdir:删除一个空的目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
pwd [-P]
# 选项与参数:
# -P :显示出确实的路径,而非使用链接 (link) 路径。
mkdir [-mp] 目录名称
# 选项与参数:
# -m :直接设置文件的权限
# -p :帮助你直接将所需要的目录(包含上层目录)递回创建起来。
# 例
mkdir -m 711 test2
rmdir [-p] 目录名称
# 选项与参数:
# -p :连同“上层”“空的”目录也一起删除

可执行文件路径的变量:$PATH

ls完整文件名为:/bin/ls(这是绝对路径),为什么我可以在任何地方执行/bin/ls这个指令? 这是因为环境变量PATH的帮助。

举例来说,执行ls时,系统会依照PATH的设置,去每个PATH定义的目录下搜寻文件名为ls的可可执行文件, 如果在PATH定义的目录中含有多个文件名为ls
可可执行文件,那么先搜寻到的同名指令先被执行。

1
2
3
echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

PATH前面加的$表示后面接的是变量。

PATH(一定是大写)这个变量的内容是由一堆目录所组成的,每个目录中间用冒号:来隔开,每个目录是有“顺序”之分的。仔细看一下上面的输出,你可以发现到无论是root还是
dmtsai都有/bin/usr/bin这个目录在PATH变量内,所以当然就能够在任何地方执行ls来找到/bin/ls可执行文件。

文件内容查阅

  • cat 由第一行开始显示文件内容
  • tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写
  • nl 显示的时候,顺道输出行号
  • more 一页一页的显示文件内容
  • less 与 more 类似,但是比 more 更好的是,他可以往前翻页
  • head 只看头几行
  • tail 只看尾巴几行
  • od 以二进制的方式读取文件内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
cat [-AbEnTv]
选项与参数:
-A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
-b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
-E :将结尾的断行字符 $ 显示出来;
-n :打印出行号,连同空白行也会有行号,与 -b 的选项不同;
-T :将 [tab]按键以 ^I 显示出来;
-v :列出一些看不出来的特殊字符
nl [-bnw] 文件
选项与参数:
-b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
-b t :如果有空行,空的那一行不要列出行号(默认值);
-n :列出行号表示的方法,主要有三种:
-n ln :行号在屏幕的最左方显示;
-n rn :行号在自己字段的最右方显示,且不加 0 ;
-n rz :行号在自己字段的最右方显示,且加 0 ;
-w :行号字段的占用的字符数。
head [-n number] 文件
选项与参数:
-n :后面接数字,代表显示几行的意思
tail [-n number] 文件
选项与参数:
-n :后面接数字,代表显示几行的意思
-f :表示持续侦测后面所接的文件名,要等到按下[ctrl]-c才会结束tail的侦测
od [-t TYPE] 文件
选项或参数:
-t :后面可以接各种“类型(TYPE)”的输出,例如:
a :利用默认的字符来输出;
c :使用 ASCII 字符来输出
d[size] :利用十进制(decimal)来输出数据,每个整数占用 size Bytes ;
f[size] :利用浮点数值(floating)来输出数据,每个数占用 size Bytes ;
o[size] :利用八进位(octal)来输出数据,每个整数占用 size Bytes ;
x[size] :利用十六进制(hexadecimal)来输出数据,每个整数占用 size Bytes

指令与文件的查找

which(寻找“可执行文件”)

1
2
3
which [-a] command
选项或参数:
-a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称

这个指令是根据“PATH”这个环境变量所规范的路径,去搜寻“可执行文件”的文件名,所以,重点是找出“可执行文件”而已!且 which 后面接的是“完整文件名”。若加上-a选项,则可以列出所有的可以找到的同名可执行文件,
而非仅显示第一个。

which默认是找PATH内所规范的目录,所以像history这种 bash 内置的指令是找不到的。要使用type指令。

查找文件

般我们都是先使用whereis或者是locate来检查,如果真的找不到了,才以find来搜寻。因为whereis只找系统中某些特定目录下面的文件而已,locate则是利用数据库来搜寻文件名,当然两者就相当的快速,
并且没有实际的搜寻硬盘内的文件系统状态,比较省时间(find是直接搜寻硬盘) 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
whereis [-bmsu] 文件或目录名
选项与参数:
-l :可以列出 whereis 会去查询的几个主要目录而已
-b :只找 binary 格式的文件
-m :只找在说明文档 manual 路径下的文件
-s :只找 source 来源文件
-u :搜寻不在上述三个项目当中的其他特殊文件
locate [-ir] keyword
选项与参数:
-i :忽略大小写的差异;
-c :不输出文件名,仅计算找到的文件数量
-l :仅输出几行的意思,例如输出五行则是 -l 5
-S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
-r :后面可接正则表达式的显示方式

locate的使用更简单,直接在后面输入“文件的部分名称”后,就能够得到结果。locate来寻找数据的时候特别的快,这是因为locate寻找的数据是由已创建的数据库/var/lib/mlocate/里面的数据所搜寻到的,
所以不用直接在去硬盘当中存取数据。

但是,locate还是有使用上的限制,因为他是经由数据库来搜寻的,而数据库的创建默认是在每天执行一次(每个 distribution 都不同,CentOS 7.x 是每天更新数据库一次),所以当你新创建起来的文件,
却还在数据库更新之前搜寻该文件,那么locate会告诉你找不到。因为必须要更新数据库。当然可以直接输入updatedb手动更新数据库。

find

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
find [PATH] [option] [action]
选项与参数:
1\. 与时间有关的选项:共有 -atime, -ctime 与 -mtime ,以 -mtime 说明
-mtime n :n 为数字,意义为在 n 天之前的“一天之内”被更动过内容的文件;
-mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件文件名;
-mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件文件名。
-newer file :file 为一个存在的文件,列出比 file 还要新的文件文件名
范例一:将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出
[root@study ~]# find / -mtime 0
# 那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前,
# 有变动过内容的文件都会被列出来!那如果是三天前的 24 小时内?
# find / -mtime 3 有变动过的文件都被列出的意思!
范例二:寻找 /etc 下面的文件,如果文件日期比 /etc/passwd 新就列出
[root@study ~]# find /etc -newer /etc/passwd
# -newer 用在分辨两个文件之间的新旧关系是很有用的!
2\. 与使用者或群组名称有关的参数:
-uid n :n 为数字,这个数字是使用者的帐号 ID,亦即 UID ,这个 UID 是记录在
/etc/passwd 里面与帐号名称对应的数字。
-gid n :n 为数字,这个数字是群组名称的 ID,亦即 GID,这个 GID 记录在
/etc/group,相关的介绍我们会第四篇说明~
-user name :name 为使用者帐号名称,例如 dmtsai
-group name:name 为群组名称喔,例如 users ;
-nouser :寻找文件的拥有者不存在 /etc/passwd 的人
-nogroup :寻找文件的拥有群组不存在于 /etc/group 的文件
当你自行安装软件时,很可能该软件的属性当中并没有文件拥有者,
这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。
范例三:搜寻 /home 下面属于 dmtsai 的文件
[root@study ~]# find /home -user dmtsai
# 这个东西也很有用的~当我们要找出任何一个使用者在系统当中的所有文件时,
# 就可以利用这个指令将属于某个使用者的所有文件都找出来喔!
范例四:搜寻系统中不属于任何人的文件
[root@study ~]# find / -nouser
# 通过这个指令,可以轻易的就找出那些不太正常的文件。如果有找到不属于系统任何人的文件时,
# 不要太紧张,那有时候是正常的~尤其是你曾经以源代码自行编译软件时。
3\. 与文件权限及名称有关的参数:
-name filename:搜寻文件名称为 filename 的文件;
-size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的文件。这个 SIZE 的规格有:
c: 代表 Byte, k: 代表 1024Bytes。所以,要找比 50KB
还要大的文件,就是“ -size +50k ”
-type TYPE :搜寻文件的类型为 TYPE 的,类型主要有:一般正规文件 (f), 设备文件 (b, c),
目录 (d), 链接文件 (l), socket (s), 及 FIFO (p) 等属性。
-perm mode :搜寻文件权限“刚好等于” mode 的文件,这个 mode 为类似 chmod
的属性值,举例来说, -rwsr-xr-x 的属性为 4755
-perm -mode :搜寻文件权限“必须要全部囊括 mode 的权限”的文件,举例来说,
我们要搜寻 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744,
当一个文件的权限为 -rwsr-xr-x ,亦即 4755 时,也会被列出来,
因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。
-perm /mode :搜寻文件权限“包含任一 mode 的权限”的文件,举例来说,我们搜寻
-rwxr-xr-x ,亦即 -perm /755 时,但一个文件属性为 -rw-------
也会被列出来,因为他有 -rw.... 的属性存在
范例五:找出文件名为 passwd 这个文件
[root@study ~]# find / -name passwd
范例五-1:找出文件名包含了 passwd 这个关键字的文件
[root@study ~]# find / -name "*passwd*"
# 利用这个 -name 可以搜寻文件名啊!默认是完整文件名,如果想要找关键字,
# 可以使用类似 * 的任意字符来处理
范例六:找出 /run 目录下,文件类型为 Socket 的文件名有哪些?
[root@study ~]# find /run -type s
# 这个 -type 的属性也很有帮助喔!尤其是要找出那些怪异的文件,
# 例如 socket 与 FIFO 文件,可以用 find /run -type p 或 -type s 来找!
范例七:搜寻文件当中含有 SGID 或 SUID 或 SBIT 的属性
[root@study ~]# find / -perm /7000
# 所谓的 7000 就是 ---s--s--t ,那么只要含有 s 或 t 的就列出,所以当然要使用 /7000,
# 使用 -7000 表示要同时含有 ---s--s--t 的所有三个权限。而只需要任意一个,就是 /7000
4\. 额外可进行的动作:
-exec commandcommand 为其他指令,-exec 后面可再接额外的指令来处理搜寻到的结果。
-print :将结果打印到屏幕上,这个动作是默认动作
范例八:将上个范例找到的文件使用 ls -l 列出来~
[root@study ~]# find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;
# 注意到,那个 -exec 后面的 ls -l 就是额外的指令,指令不支持命令别名,
# 所以仅能使用 ls -l 不可以使用 ll 喔!注意注意!
范例九:找出系统中,大于 1MB 的文件
[root@study ~]# find / -size +1M