鸟哥的 Linux ADSL 私房菜


Linux 档案与目录管理
最近更新日期:2003/02/06
目录与路径相对路径与绝对路径, cd, pwd, mkdir, rmdir, 环境变量PATH,
档案与目录管理ls, cp, rm, mv, basename, dirname,
观看档案内容cat, tac, more, less, head, tail, nl, od,
连结档的介绍什么是 inode , ln,
档案与目录权限chown, chmod, umask, chattr, lsattr,
搜寻档案或目录which, whereis, locate, find,
SetUID, SetGID, Sticky bit 与 file 指令
本章习题练习

目录与路径:
由前一章节『Linux 的档案权限与目录配置』中约略了解到 Linux 的『树状目录』概念之后,接下来就得要实际的来搞定一些基本的路径问题了!这些问题当中,最重要的莫过于『绝对路径』与『相对路径』的意义啦!赶紧来了解一下!

档案与目录管理:
谈了谈目录与路径之后,再来讨论一下关于档案的一些基本管理吧!档案与目录的管理上,不外乎『显示属性』、『拷贝』、『删除档案』及『移动档案或目录』等等,由于档案与目录的管理在 Linux 当中是很重要的!尤其是每个人自己家目录的数据也都需要注意管理!由于我们在执行程序的时后,系统预设有一个搜寻的路径顺序,如果有两个以上相同档名的执行档分别在不同的路径时,呵呵,就需要特别留意啰!这里我们来谈一谈有关档案与目录的一些基础管理部分吧!
ls 显示文件名称、属性等
cp 拷贝档案或目录
rm 删除档案或目录
mv 移动档案或目录
 

  • ls

  • 语法
    [root @test /root ]# ls [-ailS]
    参数说明:
    -a       :全部的档案都列出(连同隐藏档)
    -i       :印出 inode 的值
    -l       :长的列出,连同档案大小的数据等等
    -S       :以档案大小排序
    --color=never     :不要显示颜色
    --color=always    :均显示颜色
    --color=auto      :由系统自行判断!
    范例:
    [root @test /root]# ls -al
    total 48
    drwxr-x---    4 root     root         4096 Mar 10 00:37 .
    drwxr-xr-x   21 root     root         4096 Mar 10 20:16 ..
    -rw-------    1 root     root          524 Mar 10 00:40 .bash_history
    -rw-r--r--    1 root     root           24 Jun 11  2000 .bash_logout
    -rw-r--r--    1 root     root          266 Jun 11  2000 .bash_profile
    -rw-r--r--    1 root     root          249 Mar  6 20:50 .bashrc
    -rw-r--r--    1 root     root          210 Jun 11  2000 .cshrc
    drwx------    2 root     root         4096 Mar  9 11:06 .gnupg
    -rw-------    1 root     root          524 Jan 16 14:37 .mysql_history
    drwx------    2 root     root         4096 Mar  9 11:06 .ssh
    -rw-r--r--    1 root     root          196 Jul 11  2000 .tcshrc
    -rw-r--r--    1 root     root         1126 Aug 24  1995 .Xresources
    [root @test /]# ls
    bin   dev    etc   lib         misc  opt   root  tftpboot  usr
    boot  disk1  home  lost+found  mnt   proc  sbin  tmp       var
    [root @test /]# ls --color=never
    bin   dev    etc   lib         misc  opt   root  tftpboot  usr
    boot  disk1  home  lost+found  mnt   proc  sbin  tmp       var
    [root @test /]# ls -al|more
    说明
    还记得我们在解释档案的一些属性与目录的结构的那一章吗?!对啦!我们使用的第一支指令就是 ls 啦!通常我们都需要知道这个文件名称『目录』还是『档案』?所以,我都喜欢使用『 ll』这个指令,其实那就是ls -l 的意思啦!不论如何,你都可以尝试着执行这之指令来视察你的档案!
     
    请注意呦!不要忘记你的资料的主要咚咚!尤其是前面几个主要的属性呦!另外,你有没有发现如果在远程以 telnet 或者是 putty 的联机程序登入主机的时后,由于 Linux 预设使用有颜色的方式显示方式,但是像上表一样,蓝色的字样根本就是很难看到!这个时候通常我都是使用『ls --color=never 』来丢掉颜色!那如果想让 ls 预设没有颜色的话,可以在 /root/.bashrc 或者是你的家目录的 .bashrc 这个档案中加入下面这一行:
    alias ls='ls --color=never'
    这样就可以把颜色去到了!至于 alias 是在干嘛的?我们到了 bash 这个 shell 的时候再来谈吧!
     

  • cp

  • 语法
    [root @test /root ]# cp [-drsu] [来源档] [目的档]
    参数说明:
    -d     :在进行 copy 的时候,如果是 copy 到 link 档案,若不加任何参数,则预设情况中会将 link 到的源文件
           copy 到目的地,若加 -d 时,则 link 档案可原封不动的将 link 这个快捷方式其拷贝到目的地!
    -r     :可以进行目录的 copy 呦!
    -s          :做成连结档,而不 copy 之意!与 ln 指令相同功能!
    -u, --update:如果来源档比较新,或者是没有目的档,那么才会进行 copy 的动作!可用于备份的动作中!
    范例:
    [root @test /root]# cp    .bashrc bashrc      <==将 .bashrc 拷贝成 bashrc 这个档案!
    [root @test /root]# cp -r /bin /tmp/bin        <==这个功能就好玩啦!这是用来 copy 整个目录的参数!
    [root @test /root]# cp -s .bashrc bashrc         <==将 .bashrc 建立一个连结档,档名为 bashrc
    [root @test /root]# cp -u /home/.bashrc .bashrc  <==先检查 /home/.bashrc 是否与 .bashrc 不同,如果不同的话就开始 copy 一份!如果相同则不做任何动作!
    说明
    这个指令会常用到的呦!因为我们得常常需要 copy 资料呀!所以需要了解一下喔!如果你有些很大档案的需要备份,偏偏这个档案的更新率很低,那么每次备份都需要在 copy 一份吗?看来是不需要了!你可以使用『cp -u 来源档 目的档』来备份呦!如此一来,当档案被改变过后,才会进行 copy 的动作!
     

  • rm

  • 语法
    [root @test /root ]# rm [-fir] [檔名]
    参数说明:
    -i     :提供使用者确认(这是默认值)
    -r     :循环,就是一直杀掉,直到没有东西为止的意思
    -f     :force ,就是强力杀掉啦!
    范例:
    [root @test /root]# cp .bashrc bashrc<==建立一个新档案, bashrc
    [root @test /root]# rm bashrc           <==会显示如下的提示:
    rm: remove `bashrc'?
    [root @test /root]# mkdir testing
    [root @test /root]# cp .bashrc testing
    [root @test /root]# rmdir testing
    rmdir: `testing': Directory not empty   <==由于 testing 里面有 .bashrc ,所以砍不掉!
    [root @test /root]# rm -rf testing      <==持续删除该目录下的所有档案与目录
    说明
    这是移除的指令,相当于 dos 下的 del 指令!这里要注意的是,通常在 Linux 系统下,为了怕档案被误杀,所以都已经有 -i 这个参数, -i 是指每个档案被杀掉之前都会让使用者确认一次,以预防误杀档案!而如果要连目录下的东西都一起杀掉的话,例如子目录里面还有子目录时,那就要使用 -rf 这个参数了!不过,使用『 rm -rf 』这个指令之前,请千万注意了,因为,该目录或档案『肯定』会被 root 杀掉!因为系统不会再次询问你是否要砍掉呦! 所以那是个超级严重的指令下达呦!得特别注意!不过,如果你确定该目录不要了,那么使用 rm -rf 来循环杀掉是不错的方式!
     

  • mv

  • 语法
    [root @test /root ]# mv [-u] [来源档] [目的档]
    参数说明:
    -u   :同样的,为 update 的简写,当来源档比目的档还新的时后才会动作!
    范例:
    [root @test /root]# cp .bashrc bashrc
    [root @test /root]# mv bashrc bashrc.old
    [root @test /root]# mv bashrc bashrc2 /tmp<==将 bashrc 与 bashrc2 移动到 /tmp 这个目录下!请注意,最后一个才是最终的目标,其它的都是 SOURCE
    说明
    这是搬移的意思!当你要移动档案或目录的时后,呵呵!这个指令就很重要啦!同样的,你也可以使用 -u ( update )才测试新旧档案,看看是否需要搬移啰!另外一个用途就是『变更档名!』,我们可以很轻易的使用 mv 来变更一的档案的档名呢!
     

  • basename

  • 语法
    [root @test /root ]# basename [目录]
    参数说明:
    范例:
    [root @test /root]# basename /usr/local/etc
    etc
    这个指令会将后面的[目录]仅撷取出最后面的那个目录或档案,
    以上面的例子来看, /usr/local/etc 不论 etc 是目录或档案,
    他都会被撷取出来,因为他是最后一个出现的咚咚!
    说明
    这个指令颇有点意思~他可以将一个目录或档案的最后一个咚咚秀出来!所以,未来如果你有要使用变量,并且取出最后一个数据(不论是档案还是目录),那么使用这个玩意儿就对啦! ^_^
     

  • dirname

  • 语法
    [root @test /root ]# dirname [目录]
    参数说明:
    范例:
    [root @test /root]# dirname /usr/local/etc
    /usr/local
    恰恰与 basename 相反,他仅是秀出来前面的『目录』部分喔!
    说明
    这个指令恰恰与 basename 相反的啦!呵呵!很好玩吧!这部份也最常用在我们第三部分要讲的 Shell 的学习中喔!用最多的地方应该是 scripts 啦!用这两个宝贝蛋来撷取部分数据的内容!有用的很!

    观看档案内容cat, tac, more, less, head, tail, nl,
    刚刚我们提到的都只是在于显示档案的外观,或者是移动与复制一个档案或目录而已,那么如果我们要视察一个档案的内容时,该如何是好呢?!这里有相当多有趣的指令可以来分享一下:最常使用的显示档案内容的指令可以说是 cat 与 more 及 less 了!此外,如果我们要查看一个很大型的档案(好几百MB时),但是我们只需要后端的几行字而已,那么该如何是好?呵呵!用 tail 呀,此外, tac 这个指令也可以达到!好了,说说各个指令的用途吧!
    cat  由第一行开始显示档案内容
    tac  从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
    more 一页一页的显示档案内容
    less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
    head 只看头几行
    tail 只看尾巴几行
    nl   显示的时候,顺道输出 行号!
    od   以二进制的方式读取档案内容!
    底下我们来谈一谈每个指令的基本用法吧!

  • cat

  • 语法
    [root @test /root ]# cat [-nAE]
    参数说明:
    -n:   显示时,连行号印出屏幕上。
    -A:   将 DOS 下的 <tab> 与断行字符都列出来!
    -E:   将 DOS 编辑的文件中,仅列出 断行字符出来!
    范例:
    [root @test /root]# cat ~/.bashrc         <==显示 .bashrc 这个档案
    # .bashrc

    # User specific aliases and functions
    PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH"
    alias rm='rm -i'
    alias cp='cp -i'
    alias mv='mv -i'
    alias ll='ls -l --color=never'

    [root @test /root]# cat ~/.bashrc -n      <==显示 .bashrc 并且加上行号!
         1  # .bashrc
         2
         3  # User specific aliases and functions
         4  PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH"
         6  alias rm='rm -i'
         7  alias cp='cp -i'
         8  alias mv='mv -i'
         9  alias ll='ls -l --color=never'

    [root @test /root]# cat -A regexp.txt
    This is a cat, however, I need a dog.^M$
    I want to "Happy" and <Happy> and /Happy/ here.^M$
    OK! ^Ieverythins is OK^M$
    Now, I will eat my food^M$
    are you ^Ifinished your work^M$
    what do you 123 goto where^M$
    显示出 DOS 档案的几个特殊符号,以上面档案为例,
    可发现 ^M 为断行符号,而每行的 $ 为行尾符号,
    至于 ^I 则是 <tab> 按键啦! 

    说明
    嘿嘿! Linux 里面有『猫』?!喔!不是的, cat 是 Concatenate (连续)的简写,主要的功能是将一个档案的内容连续的印出在屏幕上面!例如上面的例子中,我们将重要的参数档 .bashrc 印出来!如果加上 -n 的话,则每一行前面还会加上行号呦!cat 比较少用!毕竟当你的档案内容的行数超过 40 行以上,嘿嘿!根本来不及看!所以,配合 more 或者是 |more 来执行比较好!此外,如果是一般的 DOS 档案时,就需要特别留意一些奇奇怪怪的符号了,例如断行与<tab>等,要显示出来,就得加入 -A 之类的参数了!。
     

  • tac

  • 语法
    [root @test /root ]# tac [檔名]
    参数说明:
    范例:
    [root @test /root]# tac ~/.bashrc <==发现了没?反向印出呦!
    fi
            . /etc/bashrc
    if [ -f /etc/bashrc ]; then
    # Source global definitions

    alias h='history'
    alias lm='ls -al|more'
    alias ll='ls -l'
    # alias ll='ls -l --color=never'
    alias mv='mv -i'
    alias cp='cp -i'
    alias rm='rm -i'

    export PATH
    PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH"
    # User specific aliases and functions

    # .bashrc

    说明
    tac 这个好玩了!怎么说呢?详细的看一下, cat 与 tac ,有没有发现呀!对啦! tac 刚好是将 cat 反写过来,所以他的功能就跟 cat 相反啦, cat 是由『第一行到最后一行连续显示在屏幕上』,而 tac 则是『由最后一行到第一行反向在屏幕上显示出来』,很好玩吧!
     

  • more

  • 语法
    [root @test /root ]# more [檔名]
    参数说明:
    范例:
    [root @test /root]# more ~/.bashrc  <==一页一页的显示档案内容
    [root @test /]# ls -al | more  <==一页一页的将 ls 的内容显示出来
    说明
    more 真是个很有用的指令!我好喜欢呦!当你的档案太大的时后,那么使用 cat 将没有办法看清楚!这个时候你可以使用 more 来做动作!more 也可以用来做为管线的同时执行之用!例如你在执行 find 这个寻找的指令时,可以同时使用 |more ,则搜寻结果可以一页一页的列出呦!关于管线( pipe )的用法我们在 bash shell 的地方再来谈!
     

  • less

  • 语法
    [root @test /root ]# less [檔名] 
    参数说明: 
    范例: 
    [root @test /root]# less ~/.bashrc 
    说明
    less 的用法比起 more 又更加的有弹性,怎么说呢?在 more 的时候,我们并没有办法向前面翻,只能往后面看,但若使用了 less 时,呵呵!就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,您瞧,是不是更容易使用来观看一个档案的内容了呢!?
     
    more 与 less 的用途与用法真的是很广啦!首先,你可以在 more 与 less 的画面中进行『搜寻』的工作!如何进行呢?我们以 less 来说明好了,如果你想要知道 /etc/man.config 这个档案里面有没有一个叫做 GER 的大写字眼,那么可以:
     
    [root @test /root ]# less /etc/man.config 
    按键说明:
    /word:在 /etc/man.config 这个档案中搜寻 word 这个字符串的所在
    q    :离开 less 的画面
     
    然后在输入 / 之后,光标会移动到最左下角等待输入,这个时候您只要输入你的字符串之后,就会自动的帮你找出来该关键词啰!
     

  • head

  • 语法
    [root @test /root ]# head [-n number] [檔名]
    参数说明:
    -n :显示 number 行
    范例:
    [root @test /root]# head ~/.bashrc  <==预设情况下,显示头十行
    [root @test /root]# head -n 20 ~/.bashrc<==显示头二十行!
    说明
    head 的英文意思就是『头』啦,那么这个东西的用法自然就是显示出一个档案的前几行啰!没错!就是这样!若没有加上 -n 这个参数时,预设只显示十行,若只要一行呢?那就加入『 head -n 1 filename 』即可!
     

  • tail

  • 语法
    [root @test /root ]# tail [-n number] [檔名]
    参数说明:
    -n :显示 number 行
    范例:
    [root @test /root]# tail ~/.bashrc
    [root @test /root]# tail -n 5 ~/.bashrc <==只显示最后面五行!
    说明
    那么有 head 自然就有 tail ( 尾巴 ) 啰!没错!这个 tail 的用法跟 head 的用法差不多类似,只是显示的是后面几行就是了!预设也是显示十行,若要显示非十行,就加 -n number 的参数!
     
    例题一:假如我想要显示 ~/.bashrc 的第 11 到第 20 行呢?
    答:
    这个应该不算难,想一想,在第 11 到第 20 行,那么我取前 20 行,再取后十行,所以结果就是:『 head –n 20 ~/.bashrc | tail –n 10 』,这样就可以得到第 11 到第 20 行之间的内容了!但是里面涉及到管线命令,需要在第三篇的时候才讲的到!
     

  • nl

  • 语法
    [root @test /root ]# nl [檔名]
    参数说明:
    范例:
    [root @test /root]# nl ~/.bashrc
    说明
    那么 nl 又是什么?这也没什么,这个指令的用法跟 cat -n 的用法类似,也就是『可以印出行号』的指令来查看档案啦!也是挺好用的!
     

  • od

  • 语法
    [root @test /root ]# od [檔名]
    参数说明:
    范例:
    [root @test /root]# od ~/.bashrc
    0000000 020043 061056 071541 071150 005143 021412 052440 062563
    0000020 020162 070163 061545 063151 061551 060440 064554 071541
    0000040 071545 060440 062156 063040 067165 072143 067551 071556
    0000060 050012 052101 036510 027442 064542 035156 071457 064542
    0000100 035156 072457 071163 071457 064542 035156 072457 071163
    0000120 061057 067151 027472 071565 027562 067554 060543 027554
    0000140 061163 067151 027472 071565 027562 067554 060543 027554
    0000160 064542 035156 050044 052101 021110 062412 070170 071157
    0000200 020164 040520 044124 005012 066141 060551 020163 066562
    0000220 023475 066562 026440 023551 060412 064554 071541 061440
    0000240 036560 061447 020160 064455 005047 066141 060551 020163
    0000260 073155 023475 073155 026440 023551 021412 060440 064554
    0000300 071541 066040 036554 066047 020163 066055 026440 061455
    0000320 066157 071157 067075 073145 071145 005047 066141 060551
    0000340 020163 066154 023475 071554 026440 023554 060412 064554
    0000360 071541 066040 036555 066047 020163 060455 076154 067555
    0000400 062562 005047 066141 060551 020163 036550 064047 071551
    0000420 067564 074562 005047 021412 051440 072557 061562 020145
    0000440 066147 061157 066141 062040 063145 067151 072151 067551
    0000460 071556 064412 020146 020133 063055 027440 072145 027543
    0000500 060542 064163 061562 056440 020073 064164 067145 004412
    0000520 020056 062457 061564 061057 071541 071150 005143 064546
    0000540 000012
    0000541
    说明
    好了,那么如果有一个非 ASCII 的数据文件呢?例如那个 binary 的档案!使用 vi 根本就是看不着~这个时候看来只有使用将整个数据以数值方法读出来啦!那就是 od 这个指令来读出来呦!这个东西可以用来输出该数据为十进制、16进位等等的数据格式!不过这个东西对于工程师可能比较有用啦!因为印出来的东西都是数字或内存当中的数据~~

    连结档的介绍:
    在开始介绍介绍连结档 ( Link ) 之前,我们得先来了解一下什么是 inode 这个东西?说实在的,这个东西真的很重要,不了解他的时候,很容易搞错很多的咚咚!
    语法
    [root @test /root ]# ln [-s] [来源档] [目的档]
    参数说明:
    -s   :提供连结档的连结!如果直接以 ln 不加任何参数的话,那么就属于 hard link 啰!
    范例:
    [root @test /root]# mkdir test
    [root @test /root]# cd test
    [root @test /test]# cp /usr/bin/passwd .

    0. 原本的信息:
    [root @test /test]# ll 
    -rw-r--r-- 1 root     root        13476 Jun 26 11:31 passwd
    [root @test /test]# du -k <==查看该目录下的占用硬盘空间
    20

    1. Hard Link 信息:
    [root @test /test]# ln passwd passwd-hard
    [root @test /test]# ll
    total 32
    -rw-r--r-- 2 root     root        13476 Jun 26 11:31 passwd
    -rw-r--r-- 2 root     root        13476 Jun 26 11:31 passwd-hard
    注意看,上面那个数字变成 2 啰!这就是占用掉 inodes 啰!
    [root @test /test]# du -k
    20  <==注意看,容量并没有变大!因为是 link 档案呀!

    2. Symbolic Link 信息:
    [root @test /test]# ln -s passwd passwd-soft; ll
    -rw-r--r--    2 root     root        13476 Jun 26 11:31 passwd
    -rw-r--r--    2 root     root        13476 Jun 26 11:31 passwd-hard
    lrwxrwxrwx    1 root     root            6 Jun 26 11:37 passwd-sofe -> passwd
    注意啰!该 Symbolic Link 的档案是有容量的呦!
    注意啰, passwd-soft 会指到另外一个档案去,而且,最前面属性显示 l ,
    此外,他是一个独立的档案!先杀掉 passwd 后,我们分别 more 一下内容:

    3. 用 more 来试试看是怎样?! 
    [root @test test]# rm passwd
    rm: remove regular file `passwd'? y
    [root @test test]# more passwd-hard
    ………(正常显示)
    [root @test test]# more passwd-soft
    passwd-soft: No such file or directory

    说明
    要注意啰!如果不加任何参数的话,那么就是 Hard Link 啰!如同上面的情况,增加了 hard link 之后,可以发现 link 那一栏属性增加了!而如果这个时候砍掉 passwd 会发生什么事情呢?呵呵! passwd-hard 的内容还是会跟原来 passwd 相同,但是 passwd-soft 就会找不到该档案啦!就是这样!了解了吗?!还有,跟 cp 也不一样呦!因为虽然 Hard Link 的档案看起来是有容量的,但是基本上还是指向原来的档案,所以啰,整体容量是没有增大的啦!
     
    而如果使用 -s 的参数时,就做成差不多是 Windows 底下的『快捷方式』的意思(Symbolic Link,较常用!)不过,需要特别注意的是, Linux 的 link 与 Windows 的快捷方式是不一样的东西!举个例子说,当你在 Windows 建立一个快捷方式时,你可以在这个快捷方式内修改任何数据,而你的原始数据并不会跟着变!不过,当你修改 Linux 下的 link 档案时,则更动的其实是『原始档』,呵呵,所以不论你的这个原始档被连结到哪里去,只要你修改了连结档,呵呵!原始档就跟着变啰!以上面为例,由于你使用 -s 的参数建立一个名为 passwd-soft 的档案,则你修改 passwd-soft 时,其内容与 passwd 完全相同,并且,当你按下储存之后,被改变的将是 passwd 这个档案!
     
    此外,如果你做了底下这样的连结:
    ln –s /bin /root/bin
    那么如果你进入 /root/bin 这个目录下,『请注意呦!该目录其实是 /bin 这个目录,因为你做了连结档了!』所以,如果你进入 /root/bin 这个刚刚建立的连结目录,并且将其中的数据杀掉时,嗯! /bin 里面的数据就通通不见了!这点请千万注意!并不是 /root 底下的资料都是 root 的!还需要注意一下该属性才行!
     
    基本上, Symbolic link 的用途比较广,所以您要特别留意 symbolic link 的用法呢!未来一定还会常常用到的啦!

    档案与目录权限:
    Linux 档案属性 的内容我们可以知道一个档案有若干个属性,包括 ( r, w, x ) 等基本属性,及是否为目录 (d) 与档案 (-) 或者是连结档 (l) 等等的属性!那么要修改属性的方法在前面也约略提过了,这里再加强补充一下!此外,由于 Linux 还可以设定其它的系统安全属性,使用 chattr 来设定,而以 lsattr 来查看,最重要的属性就是可以设定其不可修改的特性!让连档案的拥有者都不能进行修改!这个属性可是相当重要的,尤其是在安全机制上面( security )!
    chown 改变档案的拥有人
    chgrp 改变档案的所属群组
    chmod 改变档案的可写、可读、可执行等属性
    umask 改变预设的建立档案或目录时的属性
    chattr 改变档案的特殊属性
    lsattr 显示档案的特殊属性!

    搜寻档案或目录:
    档案的搜寻可就厉害了!因为我们常常需要知道那个档案放在哪里,所以来谈一谈怎么搜寻吧!在 Linux 底下也有相当优异的搜寻系统呦!通常 find 不很常用的!因为速度慢之外,也很操硬盘!通常我们都是先使用 whereis 或者是 locate 来检查,如果真的找不到了,才以 find 来搜寻呦!为什么呢?因为 whereis 与 locate 是利用数据库来搜寻数据,所以相当的快速,而且并没有实际的搜寻硬盘,比较省时间啦!
    which   查看可执行档案的位置
    whereis 查看档案的位置
    locate  配合数据库查看档案位置
    find    实际搜寻硬盘去查询文件名称

  • which

  • 语法
    [root @test /root ]# which  [文件名称]
    参数说明:
    范例:
    [root @test /root]# which passwd
    /usr/bin/passwd
    说明
    which 的基本功能是『藉由 PATH 这个环境变量的内容,去该路径内寻找可执行文件』,所以基本的功能在于『寻找执行档』啰!
     

  • whereis

  • 语法
    [root @test /root ]# whereis [-bmsu] [目录名称]
    参数说明:
    -b    :只找 binary 的档案
    -m    :只找在说明文件 manual 路径下的档案
    -s    :只找 source 来源档案
    -u    :没有说明档的档案!
    范例:
    [root @test /root]# whereis passwd
    passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.bz2
    将 passwd 相关字眼的档案或目录都列出来!

    [root @test /root]# whereis -b passwd
    passwd: /usr/bin/passwd /etc/passwd
    仅列出binary 档案!

    [root @test /root]# whereis -m passwd
    passwd: /usr/share/man/man1/passwd.1.bz2
    仅搜寻 man page 所在的目录!

    说明
    如果使用 find 太麻烦,而且时间花用的很大!(因为如果你的硬盘比较老旧的话,嘿嘿!有的等的!)这个时候 whereis 就相当的好用了!另外, whereis 可以加入参数来找寻相关的资料,例如如果你是要找可执行档( binary )那么加上 -b 就可以啦!例如上面的范例针对 passwd 这支程序来说明!如果不加任何参数的话,那么就将所有的数据列出来啰!那么 whereis 到底是使用什么咚咚呢?为何搜寻的速度会比 find 快这么多?!其实那也没有什么!这是因为 Linux 系统会将系统内的所有档案都记录在一个数据库档案里面,而当使用 whereis 或者是底下要说的 locate 时,都会以此数据库档案的内容为准,因此,有的时后你还会发现使用这两个执行档时,会找到已经被杀掉的档案!这就是因为他是一个『数据库』档案呀!另外,基本上 Linux 每天会针对 Linux 主机进行 updatedb (就是那一个数据库档案啰!)的动作,你可以在 /etc/cron.weekly/slocate.cron 这个档案找到相关的机制呦!当然,也可以直接使用 /usr/bin/updatedb 来更新数据库档案呢!
     

  • locate

  • 语法
    [root @test /root ]# locate [目录名称]
    参数说明:
    范例:
    [root @test /root]# locate root
    ……一大堆跟 root 有关字眼的档案都出来了 @_@

    [root @test /root]# updatedb        <==立刻更新数据库

    说明
    locate 的使用方式就更简单了!直接键入你要找的档名即可!但是,这个东西还是有使用上的限制呦!为什么呢?您会发现使用 locate 来寻找数据的时候特别的快,这是因为 locate 寻找的数据是由『已建立的数据库 /var/lib/slocate』里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据,呵呵!当然是很快速啰!那么有什么限制呢?就是因为他是经由数据库来搜寻的,而数据库的建立预设是在每个礼拜执行一次,所以当您新建立起来的档案,却还在数据库更新之前搜寻该档案,那么 locate 会告诉您『找不到!』呵呵!因为必须要更新数据库呀!
     
    那么我到底要建立哪些数据库呢?是否全部都要建立?似乎不需要,这个时候,你可以自己选择需要建立档案数据库的目录呢!在 /etc/updatedb.conf 这个内即可设定了!
     
    [root @test root]# more /etc/updatedb.conf
    ## Linux-Mandrake configuration.
    # 由何处开始查询数据,当然是由根目录啦!所以填入 / 即可
    FROM="/"

    # 哪些目录不想要建立档案搜寻数据,呵呵!就是那些不要的数据嘛!
    # 忘记的话,记得回上一章去看看内容,就知道为何如此设定了!
    PRUNEPATHS="/proc,/tmp,/var/tmp,/usr/tmp,/net,/afs,/mnt"

    # 安全等级
    #   0 代表关闭安全检验,速度上面较快速,但较不安全;
    #   1 启动安全简易,这是系统的默认值;
    SECURITY="1"

    # 查询的时候是否要由屏幕输出?当然不要,否则多麻烦?
    VERBOSE="NO"

    # 数据库所在处!这是默认值,不要随意移动,否则会找不到!
    DATABASE="/var/lib/slocate/slocate.db"

    # 哪些档案系统我们也不搜寻建立?就是光盘啦、非 Linux 的档案格式啦,
    # 我们都不要进行搜寻信息的建立啦!
    PRUNEFS="nfs,smbfs,ncpfs,proc,devpts,supermount,vfat,iso9660,udf,usbdevfs,devfs"

     

  • find

  • 语法
    [root @test /root ]# find [路径] [参数]
    参数说明:
    1. 时间:
       -atime n    :在 n*24 小时内被 access 即存取过的档案列出来!
       -ctime n    :在 n*24 小时内被 changed 即改变、新增的档案或目录印出
       -mtime n    :在 n*24 小时内被 modified 即修改过的档案印出
       -newer file :比 file 还要新的档案就列出来!
    2. 使用名称:
       -gid n      :寻找 群组 ID 为 n 的档案
       -group name :寻找群组名称为 name 的档案
       -uid n      :寻找拥有者 ID 为 n 的档案
       -user name  :寻找使用者名称为 name 的档案
       -name file  :寻找档名为 file 的文件名称(可以使用万用字符)
       -type type  :寻找档案属性为 type 的档案,type 包含了 b, c, d, p, l, s,
                    这些与前一章的属性相同!例如 l 为 Link 而 d 为路径之意!
    范例:
    [root @test /root]# find / -name testing            <==寻找档名为 testing 
    [root @test /root]# find / -name 'test*'       <==寻找档名包含 test 的!
    [root @test /root]# find . -ctime 1                 <==寻找目前目录下一天内新增的目录或档案
    [root @test /root]# find /home/test -newer .bashrc  <==寻找 /home/test 目录下比 .bashrc 还要新的档案
    [root @test /root]# find /home -user test       <==寻找 /home 底下拥有者为 test 的档案
    [root @test /root]# find /dev -type b               <==寻找 /dev 这个目录下,档案属性为 b 的档案
    说明
    如果你要寻找一个档案的话,那么使用 find 会是一个不错的主意!他可以根据不同的参数来给予档案的搜寻功能!例如你要寻找一个档名为 httpd.conf 的档案,你知道他应该是在 /etc 底下,那么就可以使用『 find /etc -name httpd.conf 』噜!那如果你记得有一个档案档名包含了 httpd ,但是不知道全名怎办?!呵呵,就用万用字符 * 吧,如上以:『 find /etc -name '*httpd*' 』就可将档名含有 httpd 的档案都列出来啰!不过,由于 find 在寻找数据的时后相当的耗硬盘!所以没事情不要使用 find 啦!有更棒的指令可以取代呦!那就是 whereislocate 啰!!

    SetUID, SetGID, Sticky bit 与 file 指令
    本章习题练习 ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 )
    2002/06/26:第一次完成
    2003/02/06:重新编排与加入 FAQ
    2003/02/07:加入 basenamedirname 的说明

    2002/ 03/13以来统计人数


    Designed by VBird during 2001-2003.  Aerosol Lab.