03、Linux 基础 - 目录配置、文件与目录管理

FHS:

为了让文件配置目录有秩序,让用户可以了解已安装软件通常放置于哪个目录下,于是就有了FHS标准的出炉。

HFS依据文件系统使用的频繁与否与是否允许用户随意修改,将目录定义成四种交互作用形态:

1、 可分享(shareable):可以分享给其他系统挂载使用的目录,所以包括执行文件与用户的邮件等数据,是能够分享给网络上其他主机挂载用的目录;
2、 不可分享(unshareable):自己机器上面运行的设备文件或是与程序有关的socket文件等,由于仅与自身机器有关,所以当然就不适合分享给其他主机;
3、 不变(static):有些数据是不经常变动的,跟随者发行版而不动例如函数库、文件说明、系统管理员所管理的主机服务配置文件等;
4、 可变动(variable):经常修改的数据,例如日志文件、一般用户可自行接收的新闻组等;

事实上,FHS仅是定义出最上层(/)及次层(/usr和/var)的目录内容应该要放置的文件或目录数据,因此,其他子目录层级内,就可以随开发者自行来配置

根目录的意义及内容:

根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的,同时根目录也与开机/还原/系统修复等动作有关。由于系统开机时需要特定的开机软件、核心文件、开机所需程序、函式库等等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。因为根目录是这么的重要,所以在FHS的要求方面,他希望根目录不要放在非常大的分区内,因为越大的分区你会放入越多的数据,如此一来根目录所在分区就可能会有较多发生错误的机会。

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

有鉴于上述的说明,因此FHS定义出根目录(/)底下应该要有底下这些次目录的存在才好:

FHS要求必须存在:

目录 应放置文件内容
/bin 系统有很多放置执行文件的目录,但/bin比较特殊。因为/bin放置的是在单人维护模式下还能够被操作的指令。在/bin底下的指令可以被root与一般账号所使用,主要有:cat, chmod, chown, date, mv, mkdir, cp, bash等等常用的指令。
/boot 这个目录主要在放置开机会使用到的文件,包括Linux核心文件以及开机选单与开机所需配置文件等等。Linux 内核常用的档名为:vmlinuz,如果使用的是grub这个开机管理程序,则还会存在/boot/grub/这个目录喔!
/dev 在Linux系统上,任何设备与接口设备都是以文件的形式存在于这个目录当中的。你只要通过读写这个目录底下的某个文件,就等于读写某个设备,比较重要的文件有/dev/null, /dev/zero, /dev/tty, /dev/lp*, /dev/hd*, /dev/sd*等等
/etc 系统主要的配置文件几乎都放置在这个目录内,例如人员的账号密码文件、各种服务的启始档等等。一般来说,这个目录下的各文件属性是可以让一般使用者查阅的,但是只有root有权力修改。FHS建议不要放置可执行文件(binary)在这个目录中喔。比较重要的文件有:/etc/inittab, /etc/init.d/, /etc/modprobe.conf, /etc/X11/, /etc/fstab,
/etc/sysconfig/ 等等。另外,其下重要的目录有:

 

  • /etc/init.d/:所有服务的预设启动 script都是放在这里的,例如要启动或者关闭 iptables 的话:『 /etc/init.d/iptables start』、『/etc/init.d/iptables stop』
  • /etc/xinetd.d/:这就是所谓的super daemon管理的各项服务的配置文件目录。
  • /etc/X11/:与 X Window 有关的各种配置文件都在这里,尤其是xorg.conf 这个 X Server 的配置文件。
/lib 系统的函式库非常的多,而/lib放置的则是在开机时会用到的函式库,以及在/bin或/sbin底下的指令会呼叫的函式库而已。什么是函式库呢?你可以将他想成是外挂,某些命令必须要有外挂才能够顺利完成程序的执行之意。另外,FHS还要求下面这个目录必须存在:/lib/modules/,因为该目录会放置核心相关的模块(驱动程序)喔!
/media media是『媒体』的英文,顾名思义,这个/media底下放置的就是可移除的装置啦!包括软盘、光盘、DVD等等装置都暂时挂载于此。常见的档名有:/media/floppy, /media/cdrom等等。
/mnt 如果你想要暂时挂载某些额外的装置,一般建议你可以放置到这个目录中。在古早时候,这个目录的用途与/media相同啦!只是有了/media之后,这个目录就用来暂时挂载用了。
/opt 这个是给第三方辅助软件放置的目录。什么是第三方辅助软件啊?举例来说,KDE这个桌面管理系统是一个独立的软件,不过他可以安装到Linux系统中,因此KDE的软件就建议放置到此目录下了。另外,如果你想要自行安装额外的软件(非原本的发行版提供的),那么也能够将你的软件安装到这里来。不过,以前的Linux系统中,我们还是习惯放置在/usr/local目录下呢!
/run 早期的FHS规定系统启动后所产生的各项信息应该要放到/var/run目录下,新版的FHS则规范到/run下面,由于/run可以使用内存来模拟,因此性能上会好很多
/sbin Linux有非常多指令是用来设定系统环境的,这些指令只有root才能够利用来『设定』系统,其他用户最多只能用来『查询』而已。放在/sbin底下的为开机过程中所需要的,里面包括了开机、修复、还原系统所需要的指令。至于某些服务器软件程序,一般则放置到/usr/sbin/当中。至于本机自行安装的软件所产生的系统执行文件(system binary),则放置到/usr/local/sbin/当中了。常见的指令包括:fdisk, fsck, ifconfig,
init, mkfs等等。
/srv srv可以视为『service』的缩写,是一些网络服务启动之后,这些服务所需要取用的数据目录。常见的服务例如WWW, FTP等等。举例来说,WWW服务器需要的网页数据就可以放置在/srv/www/里面。
/tmp 这是让一般使用者或者是正在执行的程序暂时放置文件的地方。这个目录是任何人都能够存取的,所以你需要定期的清理一下。当然,重要数据不可放置在此目录啊!因为FHS甚至建议在开机时,应该要将/tmp下的数据都删除唷!

FHS建议存在:

目录 应放置文件内容
/home 这是系统默认的用户家目录(home directory)。在你新增一个一般使用者账号时,默认的用户家目录都会规范到这里来。比较重要的是,家目录有两种代号喔:
~:代表目前这个用户的家目录,而
~luoluo:则代表luoluo 的家目录!
/lib<qual> 用来存放与/lib不同格式的二进制函数库,例如支持64位的/lib64函数库等
/root 系统管理员(root)的家目录。之所以放在这里,是因为如果进入单人维护模式而仅挂载根目录时,该目录就能够拥有root的家目录,所以我们会希望root的家目录与根目录放置在同一个分区中。

事实上FHS针对根目录所定义的标准就仅有上面的咚咚,不过我们的Linux底下还有许多目录你也需要了解一下的。底下是几个在Linux当中也是非常重要的目录喔:

目录 应放置文件内容
/lost+found 这个目录是使用标准的ext2/ext3文件系统格式才会产生的一个目录,目的在于当文件系统发生错误时,将一些遗失的片段放置到这个目录下。这个目录通常会在分区的最顶层存在,例如你加装一颗硬盘于/disk中,那在这个系统下就会自动产生一个这样的目录『/disk/lost+found』
/proc 这个目录本身是一个『虚拟文件系统(virtual filesystem)』喔!他放置的数据都是在内存当中,例如系统核心、行程信息(process)、周边装置的状态及网络状态等等。因为这个目录下的数据都是在内存当中,所以本身不占任何硬盘空间啊!比较重要的文件例如:/proc/cpuinfo,/proc/dma, /proc/interrupts, /proc/ioports, /proc/net/* 等等。
/sys 这个目录其实跟/proc非常类似,也是一个虚拟的文件系统,主要也是记录与核心相关的信息。包括目前已加载的核心模块与核心侦测到的硬件装置信息等等。这个目录同样不占硬盘容量喔!

除了这些目录的内容之外,另外要注意的是,因为根目录与开机有关,开机过程中仅有根目录会被挂载,其他分区则是在开机完成之后才会持续的进行挂载的行为。就是因为如此,因此根目录下与开机过程有关的目录,就不能够与根目录放到不同的分区去!那哪些目录不可与根目录分开呢?有底下这些:

  • /etc:配置文件
  • /bin:重要执行档
  • /dev:所需要的装置文件
  • /lib:执行档所需的函式库与核心所需的模块
  • /sbin:重要的系统执行文件

这五个目录千万不可与根目录分开在不同的分区!请背下来啊!好了,谈完了根目录,接下来我们就来谈谈/usr以及/var!先看/usr里面有些什么东西:

/usr 的意义与内容:

依据FHS的基本定义,/usr里面放置的数据属于可分享的与不可变动的(shareable, static),如果你知道如何透过网络进行分区的挂载(例如在服务器篇会谈到的NFS服务器),那么/usr确实可以分享给局域网络内的其他主机来使用喔!

很多读者都会误会/usr为user的缩写,其实usr是Unix Software Resource的缩写,也就是『Unix操作系统软件资源』所放置的目录,而不是用户的数据啦!这点要注意。FHS建议所有软件开发者,应该将他们的数据合理的分别放置到这个目录下的次目录,而不要自行建立该软件自己独立的目录。

因为是所有系统默认的软件(distribution(发行版)发布者提供的软件)都会放置到/usr底下,因此这个目录有点类似Windows系统的『C:\Windows\ + C:\Program files\』这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬盘容量。一般来说,/usr的次目录建议有底下这些:

FHS要求必须存在的目录

目录 应放置文件内容
/usr/bin/ 绝大部分的用户可使用指令都放在这里!目前的CentOS7已经将全部的用户命令放置与此,而使用链接文件的方式将/bin链接至此。也就是说,/usr/bin与/bin一模一样,另外,FHS要求此目录下不能有子目录。
/usr/lib/ 基本上,与/lib的功能相同,所以/lib就是链接到此目录的
/usr/local/ 系统管理员在本机自行安装自己下载的软件(非distribution(发行版)默认提供者),建议安装到此目录,这样会比较便于管理。举例来说,你的distribution提供的软件较旧,你想安装较新的软件但又不想移除旧版,此时你可以将新版软件安装于/usr/local/目录下,可与原先的旧版软件有分别啦!你可以自行到/usr/local去看看,该目录下也是具有bin, etc, include, lib…的次目录喔!
/usr/sbin/ 非系统正常运作所需要的系统指令。最常见的就是某些网络服务器软件的服务指令(daemon)啰!
/usr/share/ 放置共享文件的地方,在这个目录下放置的数据几乎是不分硬件架构均可读取的数据,因为几乎都是文本文件嘛!在此目录下常见的还有这些次目录:

 

  • /usr/share/man:在线帮助文件
  • /usr/share/doc:软件的说明文档
  • /usr/share/zoneinfo:与时区有关的时区文件

FHS建议存在的目录

目录 应放置文件内容
/usr/include/ c/c++等程序语言的档头(header)与包含档(include)放置处,当我们以tarball方式 (*.tar.gz 的方式安装软件)安装某些数据时,会使用到里头的许多包含档喔!
/usr/games/ 与游戏相关的数据存放处
/usr/libexec/ 某些不被一般用户常用的执行文件或脚本等,都会放置在此目录中。例如大部分X窗口下面的操作命令,很多都是放在此目录下
/usr/lib/ 与/lib/功能相同,因此目前/lib就是链接到此目录中
/usr/src/ 一般原始码建议放置到这里,src有source的意思。至于核心原始码则建议放置到/usr/src/linux/目录下。

/var的意义与内容:

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

目录 应放置文件内容
/var/cache/ 应用程序本身运作过程中会产生的一些暂存档;
/var/lib/ 程序本身执行的过程中,需要使用到的数据文件放置的目录。在此目录下各自的软件应该要有各自的目录。举例来说,MySQL的数据库放置到/var/lib/mysql/而rpm的数据库则放到/var/lib/rpm去!
/var/lock/ 某些装置或者是文件资源一次只能被一个应用程序所使用,如果同时有两个程序使用该装置时,就可能产生一些错误的状况,因此就得要将该装置上锁(lock),以确保该装置只会给单一软件所使用。举例来说,刻录机正在刻录一块光盘,你想一下,会不会有两个人同时在使用一个刻录机烧片?如果两个人同时刻录,那片子写入的是谁的数据?所以当第一个人在刻录时该刻录机就会被上锁,第二个人就得要该装置被解除锁定(就是前一个人用完了)才能够继续使用啰。
/var/log/ 重要到不行!这是登录文件放置的目录!里面比较重要的文件如/var/log/messages, /var/log/wtmp(记录登入者的信息)等。
/var/mail/ 放置个人电子邮件信箱的目录,不过这个目录也被放置到/var/spool/mail/目录中!通常这两个目录是互为链接文件啦!
/var/run/ 某些程序或者是服务启动后,会将他们的PID放置在这个目录下喔!至于PID的意义我们会在后续章节提到的。
/var/spool/ 这个目录通常放置一些队列数据,所谓的『队列』就是排队等待其他程序使用的数据啦!这些数据被使用后通常都会被删除。举例来说,系统收到新信会放置到/var/spool/mail/中,但使用者收下该信件后该封信原则上就会被删除。信件如果暂时寄不出去会被放到/var/spool/mqueue/中,等到被送出后就被删除。如果是工作排程数据(crontab),就会被放到/var/spool/cron/目录中!

目录树:

Linux的目录配置方式是:目录树(directory tree),它主要具有这些特性:

  • 目录树的起始点为根目录:/,root
  • 每一个目录不止能使用本地分区的文件系统,也可以使用网上的文件系统。举例来说,可以利用Network File System(NFS)服务器挂载某特点目录等
  • 每一个文件在此目录树中的文件名(包括完整路径)都是独一无二的

文件名的写法又分为绝对路径和相对路径:

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

上面的相对路径中的.和..是一个重要语法:

  • . :代表当前的目录,也可以使用./来表示
  • .. :代表上一层目录,也可以使用../来表示

目录树架构示意图:

 


目录与路径:

目录的相关操作:

相关符号解读:

  • . :代表此层目录
  • .. :代表上一层目录
  • – :代表前一个工作目录
  • ~ :代表目前使用者身份所在的家目录
  • ~joker:代表用户joker的家目录

相关命令:

  • cd:切换目录
  • pwd:显示当前所在目录
pwd [-P]
-P:显示出真正的路径,而非使用链接路径

示例(mail是个链接路径,music是个普通路径):

 

  • mkdir:建立新目录
mkdir [-mp] 目录名称
-m:设置文件的权限,直接设置,不适用默认权限(umask)
-p:帮助你直接将所需要的目录(包含上级目录)递归创建

示例:

mkdir test1
创建目录test1
mkdir -m 711 test2
创建权限711的test2
mkdir -p test3/test4/test5
递归创建test3/test4/test5
  • rmdir:删除“空”的目录
rmdir [-p] 目录名称
-p:连同上层“空的目录也一起删除

此命令只能用来删除空的目录

关于执行文件路径的变量~$PATH:

$PATH就是Linux中的环境变量,我们可以直接执行ls而不用/bin/ls,就是因为ls保存在了$PATH中。

使用echo $PATH来查看我们的PATH
echo:打印
$:表示后面接的是变量

 

PATH变量内容由一堆目录组成,中间用:隔开,每个目录有顺序之分。

如果命令不在PATH中,必须输入命令对应路径去执行,甚至同目录也要 ./XX

可以使用PATH=”${PATH}:/XXX”将XXX加入到PATH中

总结几个知识点:

  • 不同身份用户默认的PATH不同,默认能够随意执行的命令也不同(如root或luoluo)
  • PATH可以修改
  • 使用绝对路径或相对路径直接指定某个命令的文件名来执行,会比查找PATH来的正确
  • 命令要放到正确的目录下
  • 本目录(.)最好不要放到PATH中

文件目录管理命令:

ls:

[root@www ~]# ls [-aAdfFhilnrRSt] 目录名称

[root@www ~]# ls [--color={never,auto,always}] 目录名称

[root@www ~]# ls [--full-time] 目录名称

选项与参数:
-a :全部的档案,连同隐藏档( 开头为 . 癿档案) 
     一起列出来(常用)(档案前面带.表示隐藏档案)
-A :全部的档案,连同隐藏档,但不包括 . 与 .. 这两个目录
-d :仅列出目录本身,而不是列出目录内的档案数据(常用)
-f :直接列出结果,而与进行排序 (ls 预讴会以档名排序!)
-F :根据档案、目录等信息,给予附加数据结构,例如:
*:代表可执行文件; /:代表目录; =:代表 socket 档案; |:代表 FIFO 档案;
-h :将档案容量以人类较易读的方式(例如 GB, KB 等等)列出展示;
-i :列出 inode 号码,inode 癿意义下一章将会介绍;
-l :长数据串行出,包括档案的属性与权限等等数据;(常用)
-n :列出 UID 与 GID 而非使用者与群组的名称 (UID 与 GID 会在账号管理提
     到!)
-r :将排序结果反向输出,例如:原本档名由小到大,反向则为由大到小;
-R :连同子目录内容一起列出来,等于该目录下癿所有档案都会显示出来;
-S :以档案容量大小排序,而丌是用档名排序;
-t :依时间排序,而不是用档名。
--color=never :不要依据档案特性给予颜色显示;
--color=always :显示颜色
--color=auto :让系统自行依据设定来判断是否给予颜色
--full-time :以完整时间模式 (包吨年、月、日、时、分) 输出
--time={atime,ctime} :输出 access 时间戒改变权限属性时间 (ctime)
                       而非内容变更时间 (modification time)

cp:

cp除了单纯的复制之外,还可以创建链接文件 ,比对两文件的新旧而予以更新。

cp (复制文件或目录)
cp [-adfilprsu] 来源文件(source) 目标文件(destination)
cp [options] source1 source2 source3 .... directory
选项与参数:
-a :相当于 -dr --preserve=all 的意思,(常用)
-d :若来源文件为链接文件的属性(link file),则复制链接文件属性而非无链接
    属性的文件本身;
-f :为强制(force)的意思,若目标文件已经存在且无法打开,则移除后再尝试一次;
-i :若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
-l :进行硬式链接(hard link)的链接文件创建,而非复制文件本身;
-p :连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份常用);
-r :递回持续复制,用于目录的复制行为;(常用)
-s :复制成为符号链接文件 (symbolic link),亦即“快捷方式”文件;
-u :destination 比 source 旧才更新 destination,
    或 destination 不存在的情况下才复制。
--preserve=all :除了 -p 的权限相关参数外,还加入 SELinux 的属性,
                links, xattr 等属性也复制。
#注意:如果来源文件有两个以上,则最后一个目的文件一定要是“目录”才行。

复制(cp)命令是非常重要的,不同身份者执行这个命令会有不同的结果产生,尤其是-a、-p的选项,对于不同身份者来说,差别非常大。

另外,在默认情况下,cp的源文件与目标文件的权限是不同的,目标文件的拥有者通常会是命令操作者本身(即使用cp的人的身份)。

操作示例:

 

上面这个例子,我们创造了一个软链接(快捷方式),一个硬链接(后面会讲,设计inode)

注意:普通账号身份赋值文件时不能随意更改拥有者和用户组,即使加了-a、-p

rm:

rm:删除文件或目录

rm [-fir] 文件或目录
-f:就是force,忽略不存在的文件,不会出现警告信息
-i:交互模式,在删除前会询问使用者是否操作
-r:递归删除,最常用于删除目录,这是非常危险的选项

补充:

  • 要学会有效利用通配符(*) ,示例:
rm -i bash*

删除本目录下所有bash开头的文件名

  • 加上反斜杠
\rm -r /tmp/etc
#在命令前加\,可以忽略掉alias的指定选项,至于alias我们在bash再谈
#这个示例很可怕,你不要删错了,删除/etc系统会挂掉

rm -- -aaa-其实也可以

  • 删除带-的文件
rm -aaa-
#系统会报错,他把-aaa-当做是选项了
#应该这样 rm ./-aaa-

这是删除(remove)的命令,为了怕文件被root误删,所以很多Linux发行版默认加入了-i的选项。使用rm -r要多注意,因为这个目录或文件肯定会被root删除,因为系统不会再次询问你是否要删除。

mv:

rm:移动文件与目录,或重命名

mv [-fiu] source destination
mv [options] sourse1 sourse2 sourse3 …… directory
-f:强制的意思,如果目标文件已经存在,不会询问而直接覆盖
-i:若目标文件(destination)已经存在时,就会询问是否覆盖
-u:若目标文件已经存在,且source计较新,才会更新(update)

补充:

  • 利用mv去重命名
mv mvtest mvtest2  //这样就实现重命名了
#其实Linux下面还有个有趣的命令,叫rename
#该命令专职进行多个文件名的同时重命名,并非针对单一文件名进行修改,与mv不同
  • 如果有多个源文件或目录,则最后一个目标文件一定是目录

basename/dirname:

basename /etc/sysconfig/network
network    //得到文件名
dirname  /etc/sysconfig/network
/etc/sysconfig     //得到目录名

文件内容查看:

cat:

cat:直接查看一个文件的内容

cat [-AbEnTv]  文件名
-A:相当于-vET的整合选项,可列出一些特殊字符而不是空白而已
-b:列出行号,仅针对非空白行做行号显示,空白行不显示行号
-E:将结尾的换行符$打印出来
-n:打印出行号,连通空白行也会有行号,与-b不同
-T:将[Tab]键以^I显示出来
-v:列出一些看不出来的特殊字符

cat并不是猫,而是“Concatenate”(串联)的缩写

tac:

tac:反向列示

tac 文件名

和cat正好相反,不仅是功能上

nl:

nl:添加行号打印

nl  [-bnw] 文件
-b:指定行号指定的方式,主要有两种:
   -b  a:表示不论是否为空行,也同样列出行号(类似cat -n)
   -b  t: 如果有空行,空的那一行不列出行号
-n:列出行号表示的方法,主要有三种:
   -n ln:行号在屏幕最左方显示
   -n rn:行号在自己栏位的最右方显示,且不加0;
   -n rz:行号在自己栏位的最右方显示,且加0;
-w:行号栏位的占用的字符数

 

more:

more:一页一页翻动

more 文件名

在more翻动文件时,可以有如下操作

  • 空格:向下翻一页
  • Enter:向下翻一行
  • /字符串(再回车):代表在这个显示的内容中,向下查找字符串这个关键词(重复查找同一个字符串按n即可)
  • :f:立刻显示出文件名以及目前显示的行数
  • q:代表立刻离开more,不在显示该文件内容
  • b或Ctrl+b:代表往回翻页,不过这操作只对文件有用,对管道无效

less:

less:一页一页翻动

less 文件名

less相比于more更有弹性,在more的时候,我们没有办法向前翻,而用来less后,就可以用下面的按键灵活操作:

  • 空格键:向下翻动一页
  • PageDown:向下翻动一页
  • PageUp:向上翻动一页
  • /字符串:向下查找字符串的功能
  • ?字符串:向上查找字符串的功能
  • n:重复前一个查找
  • N:反向的重复前一个的查找
  • g:前进到这个数据的第一行
  • G:前进到这个数据的最后一行
  • q:离开less这个程序

man这个命令就是使用less来显示内容的

head:

head:取出前面几行

head [-n number] 文件
-n:后面接数字,代表显示几行

比较有趣的一点是:head -n后面如果接负数,则代表整个内容最后面这么多行不打印,打印剩余的前面的所有行,例如某文件有45行,head -n -5后,打印了前40行。

tail:

tail:取出后面几行

tail [-n number] 文件
-n:后面接数字,代表显示几行的意思
-f:表示持续刷新显示后面所接文件的内容,要等按下Ctrl+c才会结束

同样比较有趣的一点是:tail -n后面如果接正号的数,则代表整个内容前面这么多行不打印,打印后面所有行,例如某文件有45行,tail -n +5后,打印了从第6行开始的所有行。

示例:取出文件XXX的第11行到第20行

head -n 20 XXX | tail -n 10

中间这个|是管道命令,意思是:前面的命令所输出的信息,通过管道交由后面的命令继续使用

如果想要行号,还可以这样:

cat -n XXX | head -n 20 | tail -n 10 

od:

od:读取非纯文本文件(执行文件通常都是二进制文件)

od [-t TYPE]  文件
-t:后面可以接的TYPE的输出,比如:
    a                :利用默认的字符来输出
    c                :使用ASCII字符来输出
    d[size]          :利用十进制(deccimal)来输出数据,每个整数占用size Bytes;
    f[size]          :利用浮点数值(floating)来输出数据,每个数占用size Bytes;
    o[size]          :利用八进制(octal)来输出数据,每个整数占用size Bytes;
    x[size]          :利用十六进制(hexadecimal)来输出数据,每个整数占用size Bytes;

示例:

 

最左边第一列是以八进制来显示Bytes数,例如第二栏0000020代表开头是第16个字节(2*8)

touch:

touch:修改文件时间或创建新文件

每个文件在Linux下面都会记录许多的时间参数,其实是有三个主要的变动时间:

1、 修改时间(modificationtime,mtime):当文件的【内容数据】变更时,就会更新这个时间,内容数据指的是文件的内容,不包括属性和权限;
2、 状态时间(statustime,ctime):当文件的【状态】改变时,就会调用这个时间,举例来说,像是权限与属性被更改了都会更新这个时间;
3、 读取时间(accesstime,atime):当【该文件的内容被读取时】,就会更新这个读取时间,例如使用cat去读取;

文件的时间是很重要的,如果文件的时间错误的话,可能会导致某些程序不能运行,利用touch就可以改变文件时间,修正错误的文件时间。文件时间错误是有可能的,有的时候,由于BIOS的设置错误,导致系统时间跑到未来时间,并且你又建立了某些文件,等你将时间改回正确时,该文件就来自未来了

touch [-acdmt] 文件
-a:仅自定义access time
-c:仅修改文件的时间,若文件不存在则不创键新文件
-d:后面可以接预自定义的日期而不使用目前的日期,也可以使用--date="日期或时间"
-m:仅修改mtime
-t:后面可以接预自定义的时间而不使用目前的时间,格式为[YYYYMMDDhhmm]

 

在默认情况下,如果touch后面有接文件,则该文件的三个时间(atime,ctime,mtime)都会更新为现在的日期,如果文件不存在,则创建该空文件

完全复制文件对时间的影响:

 

ll命令就是[ls -l]的缩写,是被创造出的命令别名,不存在ll命令

我们发现,默认显示的mtime(修改时间)是老早以前,因为复制并不修改;文件是刚刚被建立的,所以ctime(状态时间)就是现在。

调整时间

 

atime和mtime发生了改变,ctime没有变(反而变成了现在的时间)

当我们复制文件或者修改时间时,即使完全复制,也没有办法改变ctime,ctime可以记录这个文件最近的状态被改变的时间。

touch最常用的场合:

  • 建立一个空文件
  • 将某个文件日期自定义为目前(atime,mtime)

文件的默认权限和隐藏权限:

文件默认权限-umask:

umask就是指定目前用户在建立文件或目录时候的权限默认值

他的指定条件以下面的内容来指定:

umask
0022       //与一般权限有关的是后面三个数字
umask -S
u=rwx,g=rx,o=rx

查看的方式有两种,一种是直接输入umask,就可以看到数字类型的权限设置值,一种则是加入-S这个选项,就会以符号类型的方式来显示出权限了。为什么出现了四组数字呢?第一个数字是特殊权限使用的,我们回头再讲。

在默认权限的情况下,文件与目录是不一样的,默认情况下:

  • 若用户建立文件则默认最大为666
-rw-rw-rw-
  • 若用户建立目录默认最大权限为777(全开放)
-rwxrwxrwx

而在umask中,那后三个数字指的是在默认值里三个部分中拿掉的,取消的权限

例如我们上面是022,则创建文件为-rw-r–r–,创建目录为-rwxr-xr-x,同组权限和其他人权限的w被拿走了

我们可以创建文件并利用ll -d 名字 查看

而我们可以用同样的数字道理,去设置umask

umask 002

还有一点要注意,计算数字时要用权限的对应去除,不能用数字去相减,例如一个umask为003,那么文件的权限就是664,不是663,它的其他人组本来就没有x权限

文件隐藏属性:

不是隐藏文件,是文件的隐藏属性

对于系统安全来说,文件的隐藏属性是非常重要的,不过要强调的是,下面的chattr命令只在ext2、ext3、ext4的Linux传统文件系统上面完整生效,其他文件系统可能已经无法完整支持这个命令了,例如xfs仅支持部分参数而已。

chattr [+-=] [ASacdistu] 文件或目录名称
+:增加某一个特殊参数,其他原本存在参数则不动
- :删除某一个特殊参数,其他原本存在的参数则不动
=:直接设置参数,且仅有后面接的参数
A:当设置了A这个属性,若你存取此文件(或目录时,它的存取
  时间atime将不会被修改。可避免I/O较慢的机器过度的读写
  磁盘。(目前建议使用文件系统挂载参数处理这个项目)
S:一般文件是非同步写入磁盘的(所以需要sync),如果加入S
  ,当你进行任何文件的修改,该修改会同步写入磁盘。
a:当设置了a,这个文件将只能增加数据,而不能删除也不能修
  改数据,只有root才能设置a。
c:这个属性设置后,将会自动的将此文件【压缩】,在读取时将
  会自动解压缩,但是在存储的时候,将会先进行压缩后再存储
 (对于大文件很有用)。
d:当dump程序被执行时,设置d属性将可使该文件(或目录)不
  会被dump备份。
i :可以让一个文件【不被删除、改名、设置链接,也无法写入
   或新增数据】,只有root才能设置该牛逼属性。
s:当文件设置了s,若该文件被删除,将会被完全从硬盘删除,
  完全无法恢复。
u:与s相反,有u的文件被删除,数据内容还存在硬盘中,可以
  使用来恢复该文件。
  • 属性设置常用a、i,且很多设置只用root能设置
  • xfs文件系统仅支持AadiS而已

 

而对应的,我们可以使用命令lsattr来显示文件隐藏属性

lsattr [-adR] 文件或目录
-a:将隐藏文件的属性也列出来
-d:如果接的是目录,仅列出目录本身的属性而非目录内的文件名
-R:连通子目录的数据一并列出

文件特殊权限(SUID、SGID、SBIT):

文件的权限处了rwx以外,还存在特殊权限

 

正如上面的s和t,这些都属于特殊权限

SetUID:

当s这个标志出现在文件拥有者的x权限上时,此时被称为Set UID,简称SUID的特殊权限。基本上SUID有这样的限制和功能:

  • SUID权限仅对二进制程序有效
  • 执行者对于该程序需要具有x的可执行文件
  • 本权限仅在执行该程序的过程中有效
  • 执行者将具有该程序拥有者(owner)的权限

即例如/usr/bin/passwd,passwd命令是修改当前用户密码,我以普通用户的身份去执行它的时候,也就是执行了这个文件,我就暂时得到了passwd文件的拥有者的权限,然后我作为root的权限,就可以去修改/etc/shadow里的我的密码,从而实现了改密码。

另外,SUID仅可用在二进制程序上,不能够用在shell脚本上面,因为shell脚本只是将很多的二进制执行文件调用执行而已,所以SUID的权限部分,还是要看shell脚本调用进来的程序的设置,而不是shell脚本本身,当然,SUID对于目录是无效的。

SetGID:

当s标志在文件拥有者的x项为SUID,那s在用户组的x时则为Set GID(SGID)

 

与SUID不同的是,SGID可以针对文件或目录来设置。如果是对文件来说,SGID有如下的功能:

  • SGID对二进制程序有用
  • 程序执行者对于程序来说,需具备X的权限
  • 执行者在执行的过程中将会获得该程序用户组的支持

与SUID非常相似,当我用luoluo去执行locate时,luoluo将暂时获得slocate用户组的支持。

除了二进制程序外,事实上SGID也能够用在目录中,这也是非常重要的一种用途。当一个目录有了SGID权限,它将具有如下功能:

  • 用户若对于此目录具有r与x权限时,该用户能够进入此目录
  • 用户在此目录下的有效用户组将会变成该目录的用户组
  • 若用户在此目录下具有w的权限,则用户所建立的新文件,该新文件的用户组与此目录的用户组相同。

Sticky Bit:

这个Sticky Bit(SBIT)目前只针对目录有效,对于文件已将没有效果了,SBIT对于目录的作用是:

  • 当用户对于此目录具有w、x权限,即具有写入的权限
  • 当用户在该目录下建立文件或目录时,仅有自己与root才有权利删除该文件

举例来说:当甲这个用户对于A目录具有用户组或其他人的身份,且具有该目录的w权限,这表示甲用户对该目录内任何人建立的目录或文件均可进行删除、更名、移动等操作。不过,如果将A目录加上了SBIT权限选项时,则甲只能够针对自己建立的文件或目录进行删除、更名、移动等操作,而无法删除其他人的文件。

特殊权限设置:

上面介绍的三种权限分别对应下面的数字:

4——SUID
2——SGID
1——SBIT

假设要修改一个文件权限为-rwsr-xr-x,则对应的命令是chmod 4755 文件名来设置

SUID不是用在目录上,SBIT不是用在文件上

而当你没有给某权限却加了SUID/SGID/SBIT时,就会出现S和T来告诉你无效
例如给一个文件7666权限,它的user、group、others都没有x,故没有位置给SUID/SGID/SBIT。

除了数字法外,也可以使用符号法处理。其中SUID为u+s,而SGID为g+s,SBIT则为o+t。示例chmod u=rwxs,go=x 文件名chmod g+s,o+t 文件名

观察文件类型-file:

了解文件信息,例如属于ASCII还是数据文件还是二进制文件,有没有用到动态链接库(share library),就可以用file:

脚本文件的查找:

在命令行中,连续按两次Tab即可知道我们可以用多少命令,那这些命令完整的文件名放在哪里呢?

which [-a] command
-a:将所有由Path目录下可以找到的命令均输出,而不止第一个被找到的

我们可以用which去找一下which

 

这个命令是根据PATH这个环境变量所规范的路径,去查找执行文件的文件名

文件的查找:

以下介绍顺序为推荐优先使用顺序

  • whereis:
whereis [-bmsu] 文件或目录名
-l:可以列出whereis会去查找的几个主要目录
-b:只找binary(二进制)的文件
-m:只找在说明文件manual路径下的文件
-s:只找source源文件
-u:查找不在上述三个项目当中的其他特殊文件

whereis主要是针对/bin /sbin下面的执行文件,以及/usr/share/man下面的man page文件

  • locate/updatedb:
locate [-ir] keyword
-i:忽略大小写的差异
-c:不输出文件名,仅计算找到的文件数量
-l:仅输出几行的意思,例如输出五行则是-l 5
-S:输出locate所使用的的数据库文件的相关信息,包括
   该数据库记录的文件/目录数量等
-r:后面可以接正则表达式的显示方式

有报错:locate: can not stat () `/var/lib/mlocate/mlocate.db’: No such file or directory,的同学请更新一下你的数据库(updatedb)

locate命令使用非常的简单,并且它会把完整的,只要还有关键词的结果都列出来,这个命令是基于一个本地的数据库/var/lib/mlocate中找的,不再去硬盘里读数据。数据库默认是会自动更新的,但我们也要经常去手动更新(利用updatedb),否则一些新文件在数据库中就找不到。

updatedb:根据/etc/updatedb.conf的设置去查找系统硬盘内的文件,并更新/var/lib/mlocate内的数据文件

  • find:
find [PATH] [option] [action]

find的参数非常丰富:

与时间有关的参数:-atime、ctime、mtime,以mtime举例:

-mtime n:意义为n天之前的【一天之内】被修改过内容的文件

-mtime +n:列出n天之前(不含n本身)被修改过内容的文件

-mtime -n:列出在n天之内(含n天本身)被修改过内容的文件

-newer file:file为一个存在的文件,列出比file还要新的文件

示例:

find / -mtime 0
找出一天之内被修改的文件(0代表现在)
find / -mtime 3
找出三天之前那天24小时内修改的文件

与使用者或用户组名有关的参数:

-uid n:n为数字,是使用者的账号ID,即UID(在/etc/passwd里)
-gid n:n为数字,是用户组的账号ID,即GID(在/etc/group里)
-user name:name为使用者账号名称
-group name:name为用户组账号名称
-nouser:查找文件的拥有者不在/etc/passwd中
-nogroup:查找文件的拥有用户组不存在于/etc/group的文件。当你自行安装
         软件时,很可能该软件的属性中没有文件拥有者,这时,就可以使
         用-nouser、-nogroup查找。

示例:

查找/home下属于luoluo的文件:
find /home -user luoluo
查找系统中不属于任何人的文件
find / -nouser

与文件权限及名称有关的参数:

-name filename:查找文件名称为filename的文件
-size [+-] SIZE:查找比此SIZE大/小的文件
                SIZE单位:c(Bytes),k(1024Bytes)
-type TYPE:查找文件的类型为TYPE的,类型主要有:一般正规文件(f),
          设备文件(b,c),目录(d),链接文件(l),socket(s),
          及FIFO(p)等属性
-perm mode:查找文件权限【刚好等于】mode的文件,mode为类似chmod的属性值
-perm -mode:查找文件权限【必须要全部囊括】mode的文件
            -perm -0744,则-rwsr-xr-x也会被找出来
-perm /mode:查找文件权限【包含任一】mode的权限
            -perm /755,则-rw-------也会被找出来

补充:

-name filename查找出的是正好叫filename的文件,若filename只是关键字,则可以利用通配符这样查找find / -name "*filename*"

利用find / -perm /7000则可以将所有sst的特殊权限文件找出,7000相当于—s–s–t

另外,find后面可以接多个目录来查找

额外进行的操作:

-exec command:command为其他命令(不能是命令别名), 
              -exec后面接其他命令来处理查找结果。
-print:将结果打印到屏幕(默认操作)

 

上面这个例子有几个值得注意的地方:

1、 {}代表的是由find找到的内容,即find查找的内容会放置到{}位置;
2、 -exec到\;是关键词,代表find的额外操作由-exec开始,到\;结束;
3、 因为;在bash环境下有特殊意义,所以用\来转义;