首页 > 代码库 > 第七章、Linux 文件与目录管理

第七章、Linux 文件与目录管理

第七章、Linux 文件与目录管理
 
1. 目录与路径
  1.1 相对路径与绝对路径
  1.2 目录的相关操作cd, pwd, mkdir, rmdir
  1.3 关於运行档路径的变量: $PATH
2. 文件与目录管理
  2.1 文件与目录的检视: ls
  2.2 复制、删除与移动cp, rm, mv
  2.3 取得路径的文件名称与目录名称
3. 文件内容查阅:
  3.1 直接检视文件内容cat, tac, nl
  3.2 可翻页检视more, less
  3.3 数据撷取head, tail
  3.4 非纯文字档: od
  3.5 修改文件时间与建置新档: touch
4. 文件与目录的默认权限与隐藏权限
  4.1 文件默认权限:umask
  4.2 文件隐藏属性: chattr, lsattr
  4.4 文件特殊权限SUID, SGID, SBIT, 权限配置
  4.3 观察文件类型:file
5. 命令与文件的搜寻:
  5.1 命令档名的搜寻:which
  5.2 文件档名的搜寻:whereis, locate, find
6. 极重要!权限与命令间的关系:
7. 重点回顾
 

 

 
1. 目录与路径
 
1.1目录与路径:
 
相对路径与绝对路径:
绝对路径:路径的写法『一定由根目录 / 写起』,例如: /usr/share/doc 这个目录
相对路径意指『相对於目前工作目录的路径!』
 

 
1.2 目录的相关操作:
技术分享
在所有目录底下都会存在的两个目录,分别是『.』与『..』 分别代表此层与上一级目录的意思
技术分享
几个常见的处理目录的命令吧:
  • cd:变换目录
  • pwd:显示目前的目录
  • mkdir:创建一个新的目录
  • rmdir:删除一个空的目录
 
2.1cd (变换目录)
技术分享
 
2.2 pwd (显示目前所在的目录)
技术分享
 
2.3 mkdir (创建新目录)
技术分享
 
2.4 rmdir (删除『空』的目录)
技术分享
 

 
1.3 关於运行档路径的变量: $PATH
 
查阅文件属性的命令ls完整档名为:/bin/ls(这是绝对路径), 那你会不会觉得很奇怪:『为什么我可以在任何地方运行/bin/ls这个命令呢? 』 为什么我在任何目录下输入 ls 就一定可以显示出一些信息而不会说找不到该 /bin/ls 命令呢? 这是因为环境变量 PATH 的帮助所致呀!
 
技术分享
你可以发现到无论是root还是vbird都有/bin 这个目录在PATH变量内,所以当然就能够在任何地方运行ls来找到/bin/ls运行档罗!
技术分享
 
例题:
假设你是root,如果你将ls由/bin/ls移动成为/root/ls(可用『mv /bin/ls /root』命令达成),然后你自己本身也在/root目录下, 请问(1)你能不能直接输入ls来运行?(2)若不能,你该如何运行ls这个命令?(3)若要直接输入ls即可运行,又该如何进行?
答:
由於这个例题的重点是将某个运行档移动到非正规目录去,所以我们先要进行底下的动作才行:(务必使用root的身份)
技术分享
(1)接下来不论你在那个目录底下输入任何与ls相关的命令,都没有办法顺利的运行ls了! 也就是说,你不能直接输入ls来运行,因为/root这个目录并不在PATH指定的目录中, 所以,即使你在/root目录下,也不能够搜寻到ls这个命令!
 
(2)因为这个ls确实存在於/root底下,并不是被删除了!所以我们可以透过使用绝对路径或者是相对路径直接指定这个运行档档名, 底下的两个方法都能够运行ls这个命令:
技术分享
(3)如果想要让root在任何目录均可运行/root底下的ls,那么就将/root加入PATH当中即可。 加入的方法很简单,就像底下这样:
技术分享
上面这个作法就能够将/root加入到运行档搜寻路径PATH中了!不相信的话请您自行使用『echo $PATH』去查看吧! 如果确定这个例题进行没有问题了,请将ls搬回/bin底下,不然系统会挂点的!
技术分享
 
技术分享
 
技术分享
 
  • 不同身份使用者默认的PATH不同,默认能够随意运行的命令也不同(如root与vbird);
  • PATH是可以修改的,所以一般使用者还是可以透过修改PATH来运行某些位於/sbin或/usr/sbin下的命令来查询;
  • 使用绝对路径或相对路径直接指定某个命令的档名来运行,会比搜寻PATH来的正确;
  • 命令应该要放置到正确的目录下,运行才会比较方便;
  • 本目录(.)最好不要放到PATH当中。
 
 

 

 
2.文件与目录管理:
 
2.1 文件与目录的检视: ls
技术分享
 

2.2 复制、删除与移动: cp, rm, mv
 
cp --除了单纯的复制之外,还可以创建连结档 (就是捷径罗),比对两文件的新旧而予以升级, 以及复制整个目录等等的功能
mv --移动目录与文件和直接拿来作更名 (rename)
rm -- 删除一个文件目录,删除全部文件
 
1.cp (复制文件或目录)
技术分享
 
1.一般来说,我们如果去复制别人的数据 (当然,该文件你必须要有 read 的权限才行啊! ^_^) 时, 总是希望复制到的数据最后是我们自己的,所以,在默认的条件中, cp 的来源档与目的档的权限是不同的,目的档的拥有者通常会是命令操作者本身。举例来说, 上面的范例二中,由於我是 root 的身份,因此复制过来的文件拥有者与群组就改变成为 root 所有了
 
2.进行备份的时候某些需要特别注意的特殊权限文件, 例如密码档 (/etc/shadow) 以及一些配置档,就不能直接以 cp 来复制,而必须要加上 -a 或者是 -p 等等可以完整复制文件权限的选项才行
 
技术分享
范例四可有趣了!使用 -l 及 -s 都会创建所谓的连结档(link file),但是这两种连结档却有不一样的情况
-- -l 就是所谓的实体连结(hard link)
bashrc_hlink文件与bashrc的属性与权限完全一模一样,与尚未进行连结前的差异则是第二栏的link数由1变成2了! 鸟哥这里先不介绍实体连结因为实体连结涉及 i-node 的相关知识,我们下一章谈到文件系统(filesystem)时再来讨论这个问题。
-- -s 则是符号连结(symbolic link)
简单来说,bashrc_slink 是一个『捷径』,类似window快捷方式,这个捷径会连结到bashrc去!所以你会看到档名右侧会有个指向(->)的符号!
 
技术分享
 
若删除源目录,则连结档失效
技术分享
 
所以,在复制时,你必须要清楚的了解到:
  • 是否需要完整的保留来源文件的资讯?
  • 来源文件是否为连结档 (symbolic link file)?
  • 来源档是否为特殊的文件,例如 FIFO, socket 等?
  • 来源档是否为目录?
 
 
2.rm (移除文件或目录)
技术分享
 
3.mv (移动文件与目录,或更名)
技术分享
 

2.3 取得路径的文件名称与目录名称
完整档名最长可以到达 4096 个字节。 那么你怎么知道那个是档名?那个是目录名?嘿嘿!就是利用斜线 (/) 来分辨啊!
一般的用途应该是在写程序的时候,用来判断之用的啦
这部分的命令可以用在第三篇内的 shell scripts 里头
1.basename
2.dirname
技术分享
 

 
3.文件内容查阅:
 
  • cat  由第一行开始显示文件内容
  • tac  从最后一行开始显示,可以看出 tac 是 cat 的倒著写!
  • nl   显示的时候,顺道输出行号!
  • more 一页一页的显示文件内容
  • less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
  • head 只看头几行
  • tail 只看尾巴几行
  • od   以二进位的方式读取文件内容!
 

3.1 直接检视文件内容: cat, tac, nl
 
1.cat (concatenate)
技术分享
如果是一般的 DOS 文件时,就需要特别留意一些奇奇怪怪的符号了, 例如断行与 [tab] 等,要显示出来,就得加入 -A 之类的选项了!
 
 
2.tac (反向列示)
技术分享
cat 是由『第一行到最后一行连续显示在萤幕上』,而 tac 则是『 由最后一行到第一行反向在萤幕上显示出来 』
 
 
3. nl (添加行号列印)
技术分享
 
 
 

3.2 可翻页检视: more, less
前面提到的 nl 与 cat, tac 等等,都是一次性的将数据一口气显示到萤幕上面
那有没有可以进行一页一页翻动的命令啊? 让我们可以一页一页的观察,才不会前面的数据看不到啊~呵呵!有的!那就是 more 与 less
 
1.more (一页一页翻动)
技术分享
 
  • 空白键 (space):代表向下翻一页;
  • Enter         :代表向下翻『一行』;
  • /字串         :代表在这个显示的内容当中,向下搜寻『字串』这个关键字;
  • :f            :立刻显示出档名以及目前显示的行数;
  • q             :代表立刻离开 more ,不再显示该文件内容。
  • b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。
技术分享
输入了 / 之后,光标就会跑到最底下一行,并且等待你的输入, 你输入了字串并按下[enter]之后,嘿嘿! more 就会开始向下搜寻该字串罗~而重复搜寻同一个字串, 可以直接按下 n 即可啊!最后,不想要看了,就按下 q 即可离开 more 啦
 
2.less (一页一页翻动)
技术分享
 
  • 空白键    :向下翻动一页;
  • [pagedown]:向下翻动一页;
  • [pageup]  :向上翻动一页;
  • /字串     :向下搜寻『字串』的功能;
  • ?字串     :向上搜寻『字串』的功能;
  • n         :重复前一个搜寻 (与 / 或 ? 有关!)
  • N         :反向的重复前一个搜寻 (与 / 或 ? 有关!)
  • q         :离开 less 这个程序;
 
查阅文件内容还可以进行搜寻的动作~瞧~ less 是否很不错用啊! 其实 less 还有很多的功能喔!详细的使用方式请使用
 
 

3.3 数据撷取: head, tail
一个最简单的撷取,那就是取出前面 (head) 与取出后面 (tail) 文字的功能。 不过,要注意的是, head 与 tail 都是以『行』为单位来进行数据撷取的
 
1.head (取出前面几行)
技术分享
 
2.tail (取出后面几行)
技术分享
 
技术分享
 
 

3.4 非纯文字档: od
 
我们想要查阅非文字档,举例来说,例如 /usr/bin/passwd 这个运行档的内容时, 又该如何去读出资讯呢?事实上,由於运行档通常是 binary file ,使用上头提到的命令来读取他的内容时, 确实会产生类似乱码的数据啊!那怎么办?没关系,我们可以利用 od 这个命令来读取
 
技术分享
 

3.5 修改文件时间与建置新档: touch
 
我们在 ls 这个命令的介绍时,有稍微提到每个文件在linux底下都会记录许多的时间参数, 其实是有三个主要的变动时间,那么三个时间的意义是什么呢?
 
  • modification time (mtime)
当该文件的『内容数据』变更时,就会升级这个时间!内容数据指的是文件的内容,而不是文件的属性或权限喔!
 
  • status time (ctime)
当该文件的『状态 (status)』改变时,就会升级这个时间,举例来说,像是权限与属性被更改了,都会升级这个时间啊。
 
  • access time (atime):
当『该文件的内容被取用』时,就会升级这个读取时间 (access)。举例来说,我们使用 cat 去读取 /etc/man.config , 就会升级该文件的 atime 了。
 
举例来说,我们来看一看你自己的 /etc/man.config 这个文件的时间吧!
技术分享
看到了吗?在默认的情况下,ls 显示出来的是该文件的 mtime ,也就是这个文件的内容上次被更动的时间。
 
文件的时间是很重要的,因为,如果文件的时间误判的话,可能会造成某些程序无法顺利的运行。 OK!那么万一我发现了一个文件来自未来,该如何让该文件的时间变成『现在』的时刻呢
技术分享
至於运行的结果当中,我们可以发现数据的内容与属性是被复制过来的,因此文件内容时间(mtime)与原本文件相同。 但是由於这个文件是刚刚被创建的,因此状态(ctime)与读取时间就便呈现在的时间啦! 那如果你想要变更这个文件的时间呢?可以这样做:
 
技术分享
 
1.要注意的是,即使我们复制一个文件时,复制所有的属性,但也没有办法复制 ctime 这个属性的。 ctime 可以记录这个文件最近的状态 (status) 被改变的时间。
 
2.还是要告知大家, 我们平时看的文件属性中,比较重要的还是属於那个 mtime 啊
 
论如何, touch 这个命令最常被使用的情况是:
  • 创建一个空的文件;
  • 将某个文件日期修订为目前 (mtime 与 atime)
 

 

 
4.文件与目录的默认权限与隐藏权限
 
除了基本r, w, x权限外,在Linux的Ext2/Ext3文件系统下,我们还可以配置其他的系统隐藏属性, 这部份可使用 chattr 来配置,而以 lsattr 来查看,最重要的属性就是可以配置其不可修改的特性!让连文件的拥有者都不能进行修改! 这个属性可是相当重要的,尤其是在安全机制上面 (security)!
 

4.1 文件默认权限:umask
umask 就是指定 『目前使用者在创建文件或目录时候的权限默认值』
技术分享
查阅的方式有两种,
一种可以直接输入 umask ,就可以看到数字型态的权限配置分数,
一种则是加入 -S (Symbolic) 这个选项,就会以符号类型的方式来显示出权限了!
奇怪的是,怎么 umask 会有四组数字啊?不是只有三组吗?是没错啦。 第一组是特殊权限用的,我们先不要理他,所以先看后面三组即可。
 
在默认权限的属性上,目录与文件是不一样的。从第六章我们知道 x 权限对於目录是非常重要的! 但是一般文件的创建则不应该有运行的权限,因为一般文件通常是用在於数据的记录嘛!当然不需要运行的权限了。 因此,默认的情况如下:
  • 若使用者创建为『文件』则默认『没有可运行( x )权限』,亦即只有 rw 这两个项目,也就是最大为 666 分,默认权限如下:
-rw-rw-rw-
 
  • 若使用者创建为『目录』,则由於 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777 分,默认权限如下:
drwxrwxrwx
 
umask 的分数指的是『该默认值需要减掉的权限!』因为 r、w、x 分别是 4、2、1 分,所以罗!也就是说,当要拿掉能写的权限,就是输入 2 分,而如果要拿掉能读的权限,也就是 4 分,那么要拿掉读与写的权限,也就是 6 分,而要拿掉运行与写入的权限,也就是 3 分
 
如果以上面的例子来说明的话,因为 umask 为 022 ,所以 user 并没有被拿掉任何权限,不过 group 与 others 的权限被拿掉了 2 (也就是 w 这个权限),那么当使用者:
  • 创建文件时:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
  • 创建目录时:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x
技术分享
 
umask的利用与重要性:专题制作
技术分享
这个 umask 对於新建文件与目录的默认权限是很有关系的!这个概念可以用在任何服务器上面, 尤其是未来在你架设文件服务器 (file server) ,举例来说, SAMBA Server 或者是 FTP server 时, 都是很重要的观念!这牵涉到你的使用者是否能够将文件进一步利用的问题喔!不要等闲视之!
 
技术分享
 
在默认的情况中, root 的 umask 会拿掉比较多的属性,root 的 umask 默认是 022 , 这是基於安全的考量啦~至於一般身份使用者,通常他们的 umask 为 002 ,亦即保留同群组的写入权力! 其实,关於默认 umask 的配置可以参考 /etc/bashrc 这个文件的内容,不过,不建议修改该文件, 你可以参考第十一章 bash shell 提到的环境参数配置档 (~/.bashrc) 的说明!
 
 

4.2 文件隐藏属性: chattr, lsattr
不过要先强调的是,底下的chattr命令只能在Ext2/Ext3的文件系统上面生效, 其他的文件系统可能就无法支持这个命令了
 
1.chattr (配置文件隐藏属性)
技术分享
由於这些属性是隐藏的性质,所以需要以 lsattr 才能看到该属性呦!其中,个人认为最重要的当属 +i 与 +a 这个属性了
 
 
2.lsattr (显示文件隐藏属性)
技术分享
 
 
 
 

4.3 文件特殊权限:SUID, SGID, SBIT, 权限配置
一直提到关於文件的重要权限,那就是 rwx 这三个读、写、运行的权限。 但是,眼尖的朋友们在第六章的目录树章节中, 一定注意到了一件事,那就是,怎么我们的 /tmp 权限怪怪的? 还有,那个 /usr/bin/passwd 也怪怪的?
技术分享
 
1.Set UID
s 这个标志出现在文件拥有者的 x 权限上时,例如刚刚提到的 /usr/bin/passwd 这个文件的权限状态:『-rwsr-xr-x』,此时就被称为 Set UID,简称为 SUID 的特殊权限。
 
基本上SUID有这样的限制与功能:
  • SUID 权限仅对二进位程序(binary program)有效;
  • 运行者对於该程序需要具有 x 的可运行权限;
  • 本权限仅在运行该程序的过程中有效 (run-time);
  • 运行者将具有该程序拥有者 (owner) 的权限。
 
举个例子来说明好了。 我们的 Linux 系统中,所有帐号的密码都记录在 /etc/shadow 这个文件里面,这个文件的权限为:『-r-------- 1 root root』,意思是这个文件仅有root可读且仅有root可以强制写入而已。 既然这个文件仅有 root 可以修改,那么鸟哥的 vbird 这个一般帐号使用者能否自行修改自己的密码呢? 你可以使用你自己的帐号输入『passwd』这个命令来看看,嘿嘿!一般使用者当然可以修改自己的密码了!
 
明明 /etc/shadow 就不能让 vbird 这个一般帐户去存取的,为什么 vbird 还能够修改这个文件内的密码呢? 这就是 SUID 的功能啦
 
我们可以知道
  1. vbird 对於 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示 vbird 能运行 passwd;
  2. passwd 的拥有者是 root 这个帐号;
  3. vbird 运行 passwd 的过程中,会『暂时』获得 root 的权限;
  4. /etc/shadow 就可以被 vbird 所运行的 passwd 所修改。
 
但如果 vbird 使用 cat 去读取 /etc/shadow 时,他能够读取吗?因为 cat 不具有 SUID 的权限,所以 vbird 运行 『cat /etc/shadow』 时,是不能读取 /etc/shadow 的。我们用一张示意图来说明如下:
技术分享
另外,SUID 仅可用在binary program 上, 不能够用在 shell script 上面!这是因为 shell script 只是将很多的 binary 运行档叫进来运行而已!所以 SUID 的权限部分,还是得要看 shell script 呼叫进来的程序的配置, 而不是 shell script 本身。当然,SUID 对於目录也是无效的~
 
2.Set GID
当 s 标志在文件拥有者的 x 项目为 SUID,那 s 在群组的 x 时则称为 Set GID, SGID
技术分享
 
与 SUID 不同的是,SGID 可以针对文件或目录来配置!如果是对文件来说, SGID 有如下的功能:
  • SGID 对二进位程序有用;
  • 程序运行者对於该程序来说,需具备 x 的权限;
  • 运行者在运行的过程中将会获得该程序群组的支持!
 
举例来说,上面的 /usr/bin/locate 这个程序可以去搜寻 /var/lib/mlocate/mlocate.db 这个文件的内容 (详细说明会在下节讲述), mlocate.db 的权限如下:
技术分享
与 SUID 非常的类似,若我使用 vbird 这个帐号去运行 locate 时,那 vbird 将会取得 slocate 群组的支持, 因此就能够去读取 mlocate.db 啦!非常有趣吧!
 
GID 也能够用在目录上,这也是非常常见的一种用途! 当一个目录配置了 SGID 的权限后,他将具有如下的功能:
  • 使用者若对於此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
  • 使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
  • 用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。
SGID 对於专案开发来说是非常重要的!因为这涉及群组权限的问题,您可以参考一下本章后续情境模拟的案例
 
3.Sticky Bit
这个 Sticky Bit, SBIT 目前只针对目录有效,对於文件已经没有效果了。 SBIT 对於目录的作用是:
  • 当使用者对於此目录具有 w, x 权限,亦即具有写入的权限时;
  • 当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件
 
换句话说:当甲这个使用者於 A 目录是具有群组或其他人的身份,并且拥有该目录 w 的权限, 这表示『甲使用者对该目录内任何人创建的目录或文件均可进行 "删除/更名/搬移" 等动作。』 不过,如果将 A 目录加上了 SBIT 的权限项目时, 则甲只能够针对自己创建的文件或目录进行删除/更名/移动等动作,而无法删除他人的文件。
 
举例来说,我们的 /tmp 本身的权限是『drwxrwxrwt』, 在这样的权限内容下,任何人都可以在 /tmp 内新增、修改文件,但仅有该文件/目录创建者与 root 能够删除自己的目录或文件。这个特性也是挺重要的啊!你可以这样做个简单的测试:
  1. 以 root 登陆系统,并且进入 /tmp 当中;
  2. touch test,并且更改 test 权限成为 777 ;
  3. 以一般使用者登陆,并进入 /tmp;
  4. 尝试删除 test 这个文件!
由於 SUID/SGID/SBIT 牵涉到程序的概念,因此再次强调,这部份的数据在您读完第十七章关於程序方面的知识后,要再次的回来瞧瞧喔! 目前,你先有个简单的基础概念就好了!
 
4.SUID/SGID/SBIT 权限配置
何配置文件使成为具有 SUID 与 SGID 的权限呢? 这就需要第六章的数字更改权限的方法了
  • 4 为 SUID
  • 2 为 SGID
  • 1 为 SBIT
 
假设要将一个文件权限改为『-rwsr-xr-x』时,由於 s 在使用者权限中,所以是 SUID ,因此, 在原先的 755 之前还要加上 4 ,也就是:『 chmod 4755 filename 』来配置!此外,还有大 S 与大 T 的产生喔!参考底下的范例啦!
 
技术分享
最后一个例子就要特别小心啦!怎么会出现大写的 S 与 T 呢?不都是小写的吗? 因为 s 与 t 都是取代 x 这个权限的,但是你有没有发现阿,我们是下达 7666 喔!也就是说, user, group 以及 others 都没有 x 这个可运行的标志( 因为 666 嘛 ),所以,这个 S, T 代表的就是『空的』啦!怎么说? SUID 是表示『该文件在运行的时候,具有文件拥有者的权限』,但是文件 拥有者都无法运行了,哪里来的权限给其他人使用?当然就是空的啦! ^_^
 
除了数字法之外,你也可以透过符号法来处理喔!其中 SUID 为 u+s ,而 SGID 为 g+s ,SBIT 则是 o+t 罗
技术分享
 
 

4.4观察文件类型:file
 
如果你想要知道某个文件的基本数据,例如是属於 ASCII 或者是 data 文件,或者是 binary , 且其中有没有使用到动态函式库 (share library) 等等的资讯,就可以利用 file 这个命令来检阅喔! 举例来说:
 
技术分享
 
 

 
5. 命令与文件的搜寻:
 
5.1 命令档名的搜寻:which
连续输入两次[tab]按键就能够知道使用者有多少命令可以下达。 那你知不知道这些命令的完整档名放在哪里?举例来说,ls 这个常用的命令放在哪里呢? 就透过 which 或 type 来找寻吧!
 
技术分享
这个命令是根据『PATH』这个环境变量所规范的路径,去搜寻『运行档』的档名~ 所以,重点是找出『运行档』而已!且 which 后面接的是『完整档名』喔!若加上 -a 选项,则可以列出所有的可以找到的同名运行档,而非仅显示第一个而已!
最后一个范例最有趣,怎么 cd 这个常用的命令竟然找不到啊!为什么呢?这是因为 cd 是『bash 内建的命令』啦! 但是 which 默认是找 PATH 内所规范的目录,所以当然一定找不到的啊!那怎办?没关系!我们可以透过 type 这个命令喔! 关於 type 的用法我们将在 第十一章的 bash 再来谈!
 
 
5.2 文件档名的搜寻:whereis, locate, find
在 Linux 底下也有相当优异的搜寻命令呦!通常 find 不很常用的!因为速度慢之外, 也很操硬盘!通常我们都是先使用 whereis 或者是 locate 来检查,如果真的找不到了,才以 find 来搜寻呦! 为什么呢?因为 whereis 与 locate 是利用数据库来搜寻数据,所以相当的快速,而且并没有实际的搜寻硬盘, 比较省时间啦
 
 
1.whereis (寻找特定文件)
技术分享
whereis 可以加入选项来找寻相关的数据, 例如如果你是要找可运行档( binary )那么加上 -b 就可以啦! 如果不加任何选项的话,那么就将所有的数据列出来罗!
 
 
whereis 到底是使用什么咚咚呢?为何搜寻的速度会比 find 快这么多? 其实那也没有什么!这是因为 Linux 系统会将系统内的所有文件都记录在一个数据库文件里面, 而当使用 whereis 或者是底下要说的 locate 时,都会以此数据库文件的内容为准, 因此,有的时后你还会发现使用这两个运行档时,会找到已经被杀掉的文件! 而且也找不到最新的刚刚创建的文件呢!这就是因为这两个命令是由数据库当中的结果去搜寻文件的所在啊! 更多与这个数据库有关的说明,请参考下列的 locate 命令。
 
2.locate
技术分享
这个 locate 的使用更简单,直接在后面输入『文件的部分名称』后,就能够得到结果。 举上面的例子来说,我输入 locate passwd ,那么在完整档名 (包含路径名称) 当中,只要有 passwd 在其中, 就会被显示出来的!这也是个很方便好用的命令,如果你忘记某个文件的完整档名时~~
 
但是,这个东西还是有使用上的限制呦!为什么呢?你会发现使用 locate 来寻找数据的时候特别的快, 这是因为 locate 寻找的数据是由『已创建的数据库 /var/lib/mlocate/』 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据,呵呵!当然是很快速罗!
 
那么有什么限制呢?就是因为他是经由数据库来搜寻的,而数据库的创建默认是在每天运行一次 (每个 distribution 都不同,CentOS 5.x 是每天升级数据库一次!),所以当你新创建起来的文件, 却还在数据库升级之前搜寻该文件,那么 locate 会告诉你『找不到!』呵呵!因为必须要升级数据库呀!
 
那能否手动升级数据库哪?当然可以啊!升级 locate 数据库的方法非常简单,直接输入『 updatedb 』就可以了! updatedb 命令会去读取 /etc/updatedb.conf 这个配置档的配置,然后再去硬盘里面进行搜寻档名的动作, 最后就升级整个数据库文件罗!因为 updatedb 会去搜寻硬盘,所以当你运行 updatedb 时,可能会等待数分钟的时间喔!
  • updatedb:根据 /etc/updatedb.conf 的配置去搜寻系统硬盘内的档名,并升级 /var/lib/mlocate 内的数据库文件;
  • locate:依据 /var/lib/mlocate 内的数据库记载,找出使用者输入的关键字档名。
 
3.find
 
3.1时间
技术分享
时间参数真是挺有意思的!我们现在知道 atime, ctime 与 mtime 的意义,如果你想要找出一天内被更动过的文件名称, 可以使用上述范例一的作法。但如果我想要找出『4天内被更动过的文件档名』呢?那可以使用『 find /var -mtime -4 』。那如果是『4天前的那一天』就用『 find /var -mtime 4 』。有没有加上『+, -』差别很大喔!我们可以用简单的图示来说明一下:
技术分享
图中最右边为目前的时间,越往左边则代表越早之前的时间轴啦。由图5.2.1我们可以清楚的知道:
  • +4代表大於等於5天前的档名:ex> find /var -mtime +4
  • -4代表小於等於4天内的文件档名:ex> find /var -mtime -4
  • 4则是代表4-5那一天的文件档名:ex> find /var -mtime 4
 
3.2 用户
技术分享
如果你想要找出某个使用者在系统底下创建了啥咚咚,使用上述的选项与参数,就能够找出来啦! 至於那个 -nouser 或 -nogroup 的选项功能中,除了你自行由网络上面下载文件时会发生之外, 如果你将系统里面某个帐号删除了,但是该帐号已经在系统内创建很多文件时,就可能会发生无主孤魂的文件存在! 此时你就得使用这个 -nouser 来找出该类型的文件罗!
 
3.3 文件属性
技术分享
上述范例中比较有趣的就属 -perm 这个选项啦!他的重点在找出特殊权限的文件罗! 我们知道 SUID 与 SGID 都可以配置在二进位程序上,假设我想要找出来 /bin, /sbin 这两个目录下, 只要具有 SUID 或 SGID 就列出来该文件,你可以这样做:
技术分享
因为 SUID 是 4 分,SGID 2 分,总共为 6 分,因此可用 +6000 来处理这个权限! 至於 find 后面可以接多个目录来进行搜寻!另外, find 本来就会搜寻次目录,这个特色也要特别注意喔!
 
3.4 额外
技术分享
find 的特殊功能就是能够进行额外的动作(action)。我们将范例八的例子以图解来说明如下:
技术分享
 
该范例中特殊的地方有 {} 以及 \; 还有 -exec 这个关键字,这些东西的意义为:
  • {} 代表的是『由 find 找到的内容』,如上图所示,find 的结果会被放置到 {} 位置中;
  • -exec 一直到 \; 是关键字,代表 find 额外动作的开始 (-exec) 到结束 (\;) ,在这中间的就是 find 命令内的额外动作。 在本例中就是『 ls -l {} 』罗!
  • 因为『 ; 』在 bash 环境下是有特殊意义的,因此利用反斜线来跳脱。
透过图 5.2.2 你应该就比较容易了解 -exec 到 \; 之间的意义了吧!
 
如果你要找的文件是具有特殊属性的,例如 SUID 、文件拥有者、文件大小等等, 那么利用 locate 是没有办法达成你的搜寻的!此时 find 就显的很重要啦!
 
另外,find 还可以利用万用字节来找寻档名呢!举例来说,你想要找出 /etc 底下档名包含 httpd 的文件, 那么你就可以这样做:
技术分享
 
 

 
6.极重要!权限与命令间的关系:
 
我们知道权限对於使用者帐号来说是非常重要的,因为他可以限制使用者能不能读取/创建/删除/修改文件或目录! 在这一章我们介绍了很多文件系统的管理命令,第六章则介绍了很多文件权限的意义。在这个小节当中, 我们就将这两者结合起来,说明一下什么命令在什么样的权限下才能够运行吧!^_^
一、让使用者能进入某目录成为『可工作目录』的基本权限为何:
  • 可使用的命令:例如 cd 等变换工作目录的命令;
  • 目录所需权限:使用者对这个目录至少需要具有 x 的权限
  • 额外需求:如果使用者想要在这个目录内利用 ls 查阅档名,则使用者对此目录还需要 r 的权限。
二、使用者在某个目录内读取一个文件的基本权限为何?
  • 可使用的命令:例如本章谈到的 cat, more, less等等
  • 目录所需权限:使用者对这个目录至少需要具有 x 权限;
  • 文件所需权限:使用者对文件至少需要具有 r 的权限才行!
三、让使用者可以修改一个文件的基本权限为何?
  • 可使用的命令:例如 nano 或未来要介绍的 vi 编辑器等;
  • 目录所需权限:使用者在该文件所在的目录至少要有 x 权限;
  • 文件所需权限:使用者对该文件至少要有 r, w 权限
四、让一个使用者可以创建一个文件的基本权限为何?
  • 目录所需权限:使用者在该目录要具有 w,x 的权限,重点在 w 啦!
五、让使用者进入某目录并运行该目录下的某个命令之基本权限为何?
  • 目录所需权限:使用者在该目录至少要有 x 的权限;
  • 文件所需权限:使用者在该文件至少需要有 x 的权限
 
 
例题:
让一个使用者 vbird 能够进行『cp /dir1/file1 /dir2』的命令时,请说明 dir1, file1, dir2 的最小所需权限为何?答:
运行 cp 时, vbird 要『能够读取来源档,并且写入目标档!』所以应参考上述第二点与第四点的说明!
因此各文件/目录的最小权限应该是:
dir1 :至少需要有 x 权限;
file1:至少需要有 r 权限;
dir2 :至少需要有 w, x 权限。
 
例题:
有一个文件全名为 /home/student/www/index.html ,各相关文件/目录的权限如下:
drwxr-xr-x 23 root root 4096 Sep 22 12:09 /
drwxr-xr-x 6 root root 4096 Sep 29 02:21 /home
drwx------ 6 student student 4096 Sep 29 02:23 /home/student
drwxr-xr-x 6 student student 4096 Sep 29 02:24 /home/student/www
-rwxr--r-- 6 student student 369 Sep 29 02:27 /home/student/www/index.html
请问 vbird 这个帐号(不属於student群组)能否读取 index.html 这个文件呢?答:
虽然 www 与 index.html 是可以让 vbird 读取的权限,但是因为目录结构是由根目录一层一层读取的,
因此 vbird 可进入 /home 但是却不可进入 /home/student/ ,既然连进入 /home/student 都不许了,
当然就读不到 index.html 了!所以答案是『vbird不会读取到 index.html 的内容』喔!
那要如何修改权限呢?其实只要将 /home/student 的权限修改为最小 711 ,或者直接给予 755 就可以罗!
这可是很重要的概念喔!
 
 

 
7.重点回顾
 
  • 绝对路径:『一定由根目录 / 写起』;相对路径:『不是由 / 写起』
  • 特殊目录有:., .., -, ~, ~account需要注意;
  • 与目录相关的命令有:cd, mkdir, rmdir, pwd 等重要命令;
  • rmdir 仅能删除空目录,要删除非空目录需使用『 rm -r 』命令;
  • 使用者能使用的命令是依据 PATH 变量所规定的目录去搜寻的;
  • 不同的身份(root 与一般用户)系统默认的 PATH 并不相同。差异较大的地方在於 /sbin, /usr/sbin ;
  • ls 可以检视文件的属性,尤其 -d, -a, -l 等选项特别重要!
  • 文件的复制、删除、移动可以分别使用:cp, rm , mv等命令来操作;
  • 检查文件的内容(读档)可使用的命令包括有:cat, tac, nl, more, less, head, tail, od 等
  • cat -n 与 nl 均可显示行号,但默认的情况下,空白行会不会编号并不相同;
  • touch 的目的在修改文件的时间参数,但亦可用来创建空文件;
  • 一个文件记录的时间参数有三种,分别是 access time(atime), status time (ctime), modification time(mtime),ls 默认显示的是 mtime。
  • 除了传统的rwx权限之外,在Ext2/Ext3文件系统中,还可以使用chattr与lsattr配置及观察隐藏属性。 常见的包括只能新增数据的 +a 与完全不能更动文件的 +i 属性。
  • 新建文件/目录时,新文件的默认权限使用 umask 来规范。默认目录完全权限为drwxrwxrwx, 文件则为-rw-rw-rw-。
  • 文件具有SUID的特殊权限时,代表当使用者运行此一binary程序时,在运行过程中使用者会暂时具有程序拥有者的权限
  • 目录具有SGID的特殊权限时,代表使用者在这个目录底下新建的文件之群组都会与该目录的群组名称相同。
  • 目录具有SBIT的特殊权限时,代表在该目录下使用者创建的文件只有自己与root能够删除!
  • 观察文件的类型可以使用 file 命令来观察;
  • 搜寻命令的完整档名可用 which 或 type ,这两个命令都是透过 PATH 变量来搜寻档名;
  • 搜寻文件的完整档名可以使用 whereis 或 locate 到数据库文件去搜寻,而不实际搜寻文件系统;
  • 利用 find 可以加入许多选项来直接查询文件系统,以获得自己想要知道的档名。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

第七章、Linux 文件与目录管理