当前位置:文档之家› 鸟哥的linux私房菜整理--Linux 档案与目录管理

鸟哥的linux私房菜整理--Linux 档案与目录管理

鸟哥的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 的『树状目录』概念之后,接下来就得要实际的来搞定一些基本的路径问题了!这些问题当中,最重要的莫过于『绝对路径』与『相对路径』的意义啦!赶紧来了解一下!

绝对路径与相对路径:

在开始目录的切换之前,你必须要先了解一下所谓的『路径, PATH』,有

趣的是:什么是『相对路径』与『绝对路径』?如果你还记得前一章的内

容的话,那么应该还记得 Linux 里面的目录是呈现『树状目录』的情况,

有就是有分支的啦!好了,假设你需要在任意一个目录下变换到根目录的

etc 底下,那么你就应该要使用『cd /etc』这个情况,这也就是所谓

的『绝对路径』,他是从根目录连续写上来的一个情况,所以不论你在哪

一个路径现执行这一个指令,都会将你移动到该路径下。那如果我是使用

『 cd etc 』呢?那表示你要切换到『目前这个目录下的 etc 目录中』,

情况可是不一样的呦!通常第一次接触 Linux 的使用者常会搞错这一个

路径的观念!

o绝对路径:路径的写法『一定由根目录 / 写起』,例如:/usr/share/doc 这个目录。

o相对路径:路径的写法『不是由 / 写起』,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成:『cd ../man』这就是

相对路径的写法啦!

那么相对路径与绝对路径有什么了不起呀!?喝!那可真的是了不起了!假设您写了一个套件,这个套件共需要三个目录,分别是 etc, bin, man 这三个目录,然而由于不同的人喜欢安装在不同的目录之下,假设甲安装的目录是 /usr/local/packages/etc, /usr/local/packages/bin 及

/usr/local/packages/man ,不过乙却喜欢安装在 /home/packages/etc, /home/packages/bin, /home/packages/man 这三个目录中,请问如果需

要用到绝对路径的话,那么是否很麻烦呢?是的!如此一来每个目录下的东西就很难对应的起来!这个时候相对路径的写法就显的特别的重要了!

此外,如果您跟我一样,喜欢将路径的名字写的很长,好让自己知道那个

目录是在干什么的,例如:/data4/staiwan19961109/models-3/smoke 这个目录,而另一个目录在 /data4/staiwan19961109/models-3/cctm ,那么我从第一个要到第二个目录去的话,怎么写比较方便?当然是

『 cd ../cctm 』比较方便啰!对吧!

好了,既然要谈到目录这个东西,自然就需要了解一下有哪些常用的目录『符号』代表的意义啦!

底下我们要来谈一谈目录与路径的几个常用的指令:

o cd变换目录

o pwd显示当前目录

o mkdir建立一个新目录

o rmdir删除一个里面是空的空目录

?cd 与 pwd

这两个指令主要是在『变换目前目录』与『显示目前所在目录』的工作,底下说一说他们的用途与语法吧!

?cd

语法:

?说明:

cd 是 change directory 的缩写,这是用来变换工作路径的指令。注意,路径与 cd 指令之间存在一个空格!一登入 Linux 系统后,root 会在root 的家目录,亦即 /root 下,至于使用者会在预设的 /home/username 底下,例如鸟哥的 ID 为 vbird ,则以 vbird 的身份登入后,会到

/home/vbird 这个路径下。OK!那回到上一层可以用『 cd .. 』而到相对路径可到『 cd ../bird』,至于绝对路径则是 cd /usr/sbin !注意喔,在前面的提示字符会改变路径名称!此外,家目录还有一个代码,那就是『 ~ 』符号!例如上面的例子可以发现,使用『 cd ~ 』可以回到个人的家目录里头去呢!此外,如果你的 Linux 主机当中有个 testing

的账号,你要到他的家目录去,可以下达『cd ~testing』立刻去到

testing 的家目录啰!

?

?pwd

语法:

?说明:

pwd 是 print working directory 的缩写,也就是显示目前所在目录的指令,例如在上个表格最后的目录是 /home/test 这个目录,但是提示字符仅显示 test ,如果你想要知道目前所在的目录,可以输入 pwd 即可:

此外,由于很多的套件所使用的目录名称都相同,例如 /usr/local/etc 还有 /etc ,但是通常 Linux 仅列出最后面那一个目录而已,这个时候你就可以使用 pwd 来知道你的所在目录啰!免得搞错目录,结果……

?

?mkdir 与 rmdir 管理目录:

那么要如何建立删除目录呢?很简单呀!就用 mkdir 与 rmdir ,看出来了吗?没错啦!就是 make/remove directory 的缩写说!看要怎么用吧!

?mkdir

语法:

?说明:

如果想要建立新的目录的话,那么就使用 mkdir 吧!不过,请注意呦!

在默认的情况下,你所需要的目录得一层一层的建立才行!例如:假如你要建立一个目录为 /home/bird/testing/test1,那么首先必须要有

/home 然后 /home/bird ,再来 /home/bird/testing 都必须要存在,才可以建立 test1 这个目录!假如没有 /home/bird/testing 时,就没有办法建立 test1 的目录啰!不过,现在有个更简单有效的方法啦!那就

是加上 -p 这个参数喔!你可以直接下达:『mkdir -p

/home/bird/testing』则系统会自动的帮你将 /home, /home/bird,

/home/bird/testing 依序的建立起目录!并且,如果该目录本来就已经存在时,系统也不会显示错误讯息喔!挺快乐的吧! ^_^

?

?rmdir

语法:

?说明:

如果想要建立删除旧有的目录时,就使用 rmdir 吧!例如将刚刚建立的test 杀掉,使用 rmdir test 即可!请注意呦!目录需要一层一层的删除才行!而且被删除的目录里面必定不能还有其他的目录或档案!那如果要将所有目录下的东西都杀掉呢?!这个时候就必须使用 rm -rf test 啰!

不过,还是使用 rmdir 比较不危险!不过,你也可以尝试以 -p 的参数加入,来删除上层的目录喔!

?

?环境变量 PATH

在提过了绝对路径、相对路径与指令的下达方式之后,您应该会稍微注意到一件事情,那就是:『为什么我可以在 /root 底下执行 /bin/ls 这个档案呢?』对呀!为什么我可以直接执行 ls 就一定可以显示出一些讯息

而不会说找不到该档案呢?这是因为环境变量 PATH 的帮助所致呀!当我们在执行一个指令的时候,系统会依照 PATH 的设定去每个 PATH 定义的路径下搜寻档案,先搜寻到的脚本文件案先被执行之!现在,请下达echo $PATH , echo 有『显示、印出』的意思,而 PATH 前面加的 $ 表示后面接的是变量,所以即会显示出目前的 PATH 了!

?

注意到了吗?对啦! /bin 在 PATH 的设定之中,所以自然就可以找的到ls 啦!

o如果你将 ls 移动到 /root 底下的话,然后你自己本身也在/root 底下,但是当你执行 ls 的时候,他就是不理你?怎么办?

这是因为 PATH 没有 /root 这个目录,而你又将 ls 移动到

/root 底下了,自然系统就找不到可执行文件了,因此就会告诉你,

command not found !那么该怎么克服这种问题呢?有两个方法,

其一:直接将 /root 的路径加入 PATH 当中!如何增加?可以使

用:

PATH=”$PATH”:/root

这种方式来增加即可!另一种方式则是使用完整档名,亦即直接使

用相对或绝对路径来执行,例如:

/root/ls

./ls

因为在同一个目录中,而我们又知道在同一个目录中的目录符号为

『 . 』,因此,就以上面的 ./ls 来执行也可以!这种执行方式

以后您应该会很常见到才对!

?

o如果我有两个 ls 档案在不同的目录中,例如 /usr/local/bin/ls 底下与 /bin/ls 那么当我下达 ls 的时候,那个 ls 会被执行?

那还用说,就找出 PATH 里面那个目录先被查询,则那个目录下的

档案就会被先执行了!

o咦!既然如此的话,那么为何不要在 PATH 里面加入 . 这个目录,如此一来的话,不就可以直接在所在目录执行档案了吗?因为 .

代表所在目录嘛!是这样没错!但是有没有想过,如果某天,某个

怪怪的使用者在 /tmp 里面写了一个 ls 的档案,偏偏他是有害的

档案,那么当你在 /tmp 底下执行 ls 时,怎么办?!没错,可能

会『中标』,所以啰,为了安全起见,不建议将『 . 』加入 PATH

的搜寻当中!

档案与目录管理:

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

ls显示文件名、属性等

cp拷贝档案或目录

rm删除档案或目录

mv移动档案或目录

ls

还记得我们在解释档案的一些属性与目录的结构的那一章吗?!对啦!我们使用的第一支指令就是 ls 啦!通常我们都需要知道这个文件名『目录』还是『档案』?

所以,我都喜欢使用『ll』这个指令,其实那就是ls -l的意思啦!不论如何,

你都可以尝试着执行这之指令来视察你的档案!

请注意呦!不要忘记你的资料的主要咚咚!尤其是前面几个主要的属性呦!另外,你有没有发现如果在远程以 telnet 或者是 putty 的联机程序登入主机的时后,由于 Linux 预设使用有颜色的方式显示方式,但是像上表一样,蓝色的字样根

本就是很难看到!这个时候通常我都是使用『ls --color=never』来丢掉颜色!

那如果想让 ls 预设没有颜色的话,可以在 /root/.bashrc 或者是你的家目录的 .bashrc 这个档案中加入下面这一行:

alias ls='ls --color=never'

这样就可以把颜色去到了!至于 alias 是在干嘛的?我们到了 bash 这个

shell 的时候再来谈吧!

?cp

这个指令会常用到的呦!因为我们得常常需要 copy 数据呀!所以需要了解一下喔!如果你有些很大档案的需要备份,偏偏这个档案的更新率很低,那么每次备

份都需要在 copy 一份吗?看来是不需要了!你可以使用『cp -u 来源档目的

檔』来备份呦!如此一来,当档案被改变过后,才会进行 copy 的动作!

?rm

这是移除的指令,相当于 dos 下的 del 指令!这里要注意的是,通常在 Linux 系统下,为了怕档案被误杀,所以都已经有 -i 这个参数, -i 是指每个档案被杀掉之前都会让使用者确认一次,以预防误杀档案!而如果要连目录下的东西都一起杀掉的话,例如子目录里面还有子目录时,那就要使用 -rf 这个参数了!

不过,使用『rm -rf』这个指令之前,请千万注意了,因为,该目录或档案

『肯定』会被 root 杀掉!因为系统不会再次询问你是否要砍掉呦!所以那是个超级严重的指令下达呦!得特别注意!不过,如果你确定该目录不要了,那么使用 rm -rf 来循环杀掉是不错的方式!

?mv

这是搬移的意思!当你要移动档案或目录的时后,呵呵!这个指令就很重要啦!同样的,你也可以使用 -u ( update )才测试新旧档案,看看是否需要搬移啰!另外一个用途就是『变更档名!』,我们可以很轻易的使用 mv 来变更一的档案的档名呢!

?basename

这个指令颇有点意思~他可以将一个目录或档案的最后一个咚咚秀出来!所以,未来如果你有要使用变量,并且取出最后一个数据(不论是档案还是目录),那么使用这个玩意儿就对啦! ^_^

dirname

这个指令恰恰与 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

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

tac

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

more 真是个很有用的指令!我好喜欢呦!当你的档案太大的时后,那么使用 cat 将没有办法看清楚!这个时候你可以使用 more 来做动作!more 也可以用来做为管线的同时执行之用!例如你在执行 find 这个寻找的指令时,可以同时使用|more ,则搜寻结果可以一页一页的列出呦!关于管线( pipe )的用法我们在bash shell 的地方再来谈!

?less

less 的用法比起 more 又更加的有弹性,怎么说呢?在 more 的时候,我们并没有办法向前面翻,只能往后面看,但若使用了 less 时,呵呵!就可以使用[pageup] [pagedown] 等按键的功能来往前往后翻看文件,您瞧,是不是更容易使用来观看一个档案的内容了呢!?

more 与 less 的用途与用法真的是很广啦!首先,你可以在 more 与 less 的画面中进行『搜寻』的工作!如何进行呢?我们以 less 来说明好了,如果你想要知道 /etc/man.config 这个档案里面有没有一个叫做 GER 的大写字眼,那么可以:

然后在输入 / 之后,光标会移动到最左下角等待输入,这个时候您只要输入你的字符串之后,就会自动的帮你找出来该关键词啰!

head 的英文意思就是『头』啦,那么这个东西的用法自然就是显示出一个档案的前几行啰!没错!就是这样!若没有加上 -n 这个参数时,默认只显示十行,

若只要一行呢?那就加入『head -n 1 filename』即可!

?tail

那么有 head 自然就有 tail ( 尾巴 ) 啰!没错!这个 tail 的用法跟 head 的用法差不多类似,只是显示的是后面几行就是了!默认也是显示十行,若要显示非十行,就加 -n number 的参数!

那么 nl 又是什么?这也没什么,这个指令的用法跟cat-n 的用法类似,也就是『可以印出行号』的指令来查看档案啦!也是挺好用的!

?od

说明:

好了,那么如果有一个非 ASCII 的数据文件呢?例如那个 binary 的档案!使用 vi 根本就是看不着~这个时候看来只有使用将整个数据以数值方法读出来啦!那就是 od 这个指令来读出来呦!这个东西可以用来输出该数据为十进制、16进位等等的数据格式!不过这个东西对于工程师可能比较有用啦!因为印出来的东西都是数字或内存当中的数据~~

连结档的介绍:

在开始介绍介绍连结档 ( Link ) 之前,我们得先来了解一下什么是 inode 这个东西?说实在的,这个东西真的很重要,不了解他的时候,很容易搞错很多的咚咚!

什么是 inodes ?

要提到 inode 之前,我们得先来了解一下硬盘的整体构造才行!硬盘里

面有多个硬盘盘组合在一起,而一个硬盘盘可以如下图所示,硬盘盘为圆形的,其中,每一个硬盘盘上面都有个可以读写的磁头( Head ),而当这个磁头固定住,让硬盘盘转一圈,那么那一个圆形的就是磁道( Track )

啦,而在硬盘内的几个硬盘盘同半径的那一圈的磁道总和称为磁柱

( Cylinder ),而由圆心向外画出直线,可以得到如下图所示,那么那一颗一颗的咚咚,就是硬盘的最小储存物理量,我们称为扇区( setctor ),一个扇区的物理量大约是 512 bytes ( 约 0.5K )。

磁头 ( Head ) :可擦写的金属磁盘;

磁道 ( Track ) :读写头转一圈 ( 同心圆的一圈 ) 的量;

扇区 ( Sector ) :最小的物理储存量。

好了,知道了大体的硬盘构造之后,再来谈一谈怎么硬盘分割( partition )呢?我们在进行硬盘分割的时候,最小都是以磁柱为单位进行分割的,那么分割完成之后自然就是格式化( format )啰,在 Linux 里面我们在进行格式化的时候必须要考虑到 Block 与 inode 的信息,这个 block 还好理解,他是我们磁盘可以记录的最小单位,是由数个 sector 所组成的,所以他的大小通常为 n*512 bytes ,例如 4K 。那么 inode 是什么? Block 是记录『档案内容数据』的地区,而 inode 则是记录『该档案的属性、及该档案放置在哪一个 Block 之内』的信息!所以,每个档案都会占用到至少一个 inode 。而当我们 Linux 系统要找到这个档案时,他会先去搜寻 inode table 找到这个档案的属性及数据放置的地区,然后再到数据去找到数据存放的 Block 进而将数据取出利用。这个 inode 数目在一开始就会被设定好,他的设定方式通常是利用 ( 硬盘大小 / 一个容量 ),这个容量至少应该比 Block 要大一些较佳,例如刚刚的 Block 订为 4K ,那么 inode 可以订为 8K 左右。所以,一颗 1GB 的硬盘,如果以 8K 来规划他的 inode 数时,他的 inode 就会有 131072 个 inode 啦!而一个 inode 的大小为 128 bytes 这么大!这么一来的话,我们就可以清楚的知道了,那就是一个 partition 格式化为一个 filesystem 之后,基本上,他一定会有 inode table 与 data area 两个区块,一个用来记录档案的信息与该档案放置的 block 区块,一个用来记录档案的内容!

由于我们 Linux 在读取数据的时候,是先查询 inode table 以得到数据是放在那个 Block 里面,然后再去该 Block 里面读取真正的数据内容!然后,那个 block 是我们在格式化硬盘的时候规定出来的一个值,这个

block 是由 2 的 n 次方个 sector 所集结而成的!所以,他是 0.5K 的倍数喔!假设我们 block 规划为 4KBytes 好了,那么由于一个 inode 与一个 block 最多均只纪录一个档案,所以,哈哈!如果你的一个档案有

0.1 K bytes 这么大时,你要晓得的是,由于你的 block 为 4K bytes ,

因此,你就会有 3.9 Kbytes 的空间『浪费掉』喔!所以,当你在格式化硬盘的时候,请千万注意到你的系统未来的使用方向喔!

o当 block 越小 ( 最小为 0.5K ) 、inodes 越多,可利用空间越多,但是大档案写入效率较差:适合档案数量多但是档案容量小的

系统,例如 BBS 或者新闻组 news 这方面的服务之系统;

o当 block 越大 ( 最大可到 16 * 0.5K 以上 ) 、 inodes 数越少,大档案写入效率较佳,但浪费的空间较多:适合档案容量大的系统。

ln

OK!知道了什么是 inode 与他的功能之后,接着下来就要来介绍 link 这个玩意儿了!说到 link 其实也没有什么大不了的,说穿了,就真的有点像是 Windows 的『快捷方式』一样,不过, link 的功能要好的多呦! Link 又分为 hard link 与 symbolic link 两种方式,分别来谈一谈:

o Hard Links:

刚刚说过,当系统要读取某一个档案的时候,就会先去读 inode

table ,然后再根据 inode 的信息到 block area 去将数据取出

来利用!而 hard link 就是直接再建立一个 inode 连结到档案放

置的 block 区块。也就是说,进行 hard link 的时候,实际上,

你的档案内容不会改变,只是你在查询的时候,利用原来的 inode

与后来的 inode 均可被指定到该档案放置的地点,因此两个档案

的内容会是一样的!所以读取任何一个 inode 的结果都是存取在

同一个档案的内容就是了。不过,这样一来就有个问题啦,因为

inode 是会链接到 block 区域去的,而『目录』本身仅消耗 inode

而已,那么一来的话, hard link 不就不能 link 目录啦?对的!

没错! Hard link 有两个最大的限制:

1.不能跨 filesystem ,因为不同的 filesystem 有不同的

inode table 嘛!

2.不能 link 目录!

o Symbolic Links:

相对于 hard link , Symbolic link 可就好理解多了,基本上,

他就是在建立一个独立的档案,而这个档案会让数据读取指向他

link 的那个档案内容!由于只是利用档案来做为指向的动作,所

以,当来源档被删除之后,symbolic link 的档案会『开不了』,会一直说『无法开启某档案!』

所以,看样子,似乎 hard link 比较安全,因为即使某一个 inode 被杀掉了,只要有任何一个 inode 存在,那么该档案就不会不见!不过,不幸的是,由于 Hard Link 的限制太多了,包括无法做『目录』的 link ,所以在用途上面是比较受限的!反而是 Symbolic Link 的使用方向较广喔!好了,说的天花乱坠,看您也差不多快要昏倒了!没关系,实作一下就知道怎么回事了!

特别留意,底下的案例中,我们是将系统的配置文件 copy 到 /root/test 底下进行测试用的,请不要在 /etc/ 底下做,未来我们的工作目录都会在 /root/test 底下进行,这有个好处,是可以让您清楚的知道,这是用来 test 用的啦!

相关主题
文本预览
相关文档 最新文档