鸟哥的第一本书籍的主要内容,内容稍微与书籍不太一样了!
鸟哥的第一本书大约是在 2002 年的年底左右出版的,内容几乎都是 Linux 基础学习,一点也没有谈到服务器的部份!这也是后来的雏型! 不过内容错误的地方很多,导致在 2003 年的年底推出了『基础学习篇增订版』的内容,大致上就是处理掉一些比较有严重错误的部份。 不过,因为 Linux 的版本变化非常快速,因此,写完了这些文档之后,鸟哥还是持续在网站上更新文档内容,导致原本书籍内容的数据与网站数据差异太大! 这个问题直到鸟哥在 2008 年左右才发现!糟糕了!旧版的文档数据已经遗失~觉得相当扼腕~
因此,在底下的文档内容与当初的书籍内容虽然大同小异,不过章节的编排却是有所不同!再花时间去一个一个处理,似乎也不太符合成本效益! 鸟哥仅是想要将自己以前的文档记录下来而已,同时将过时的 big5 编码改回 utf8 编码,再加上可以支持 RWD 的样式而已啦! 内容已经不多做编排~因此,如果内容文档你看不懂,那也是应该的! ^_^
建议您前往本站查找最新版本的 Linux distribution 文章来阅读,比较不会浪费时间。最新文章请前往鸟站首页查阅啰!
由前一章节『Linux 的文件权限与目录配置』中约略了解到 Linux 的『树状目录』概念之后,接下来就得要实际的来搞定一些基本的路径问题了!这些问题当中,最重要的莫过于『绝对路径』与『相对路径』的意义啦!赶紧来了解一下!
- 绝对路径与相对路径:
在开始目录的切换之前,你必须要先了解一下所谓的『路径, PATH』,有趣的是:什么是『相对路径』与『绝对路径』?如果你还记得前一章的内容的话,那么应该还记得 Linux 里面的目录是呈现『树状目录』的情况,有就是有分支的啦!好了,假设你需要在任意一个目录下变换到根目录的 etc 底下,那么你就应该要使用『 cd /etc 』这个情况,这也就是所谓的『绝对路径』,他是从根目录连续写上来的一个情况,所以不论你在哪一个路径现运行这一个指令,都会将你移动到该路径下。那如果我是使用『 cd etc 』呢?那表示你要切换到『目前这个目录下的 etc 目录中』,情况可是不一样的呦!通常第一次接触 Linux 的用户常会搞错这一个路径的观念!
- 绝对路径:路径的写法『一定由根目录 / 写起』,例如: /usr/share/doc 这个目录。
- 相对路径:路径的写法『不是由 / 写起』,例如由 /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 』比较方便啰!对吧!
好了,既然要谈到目录这个东西,自然就需要了解一下有哪些常用的目录『符号』代表的意义啦!
. 代表此层目录
.. 代表上层目录
~ 代表自己的家目录
~user 代表到 user 这个人的家目录
底下我们要来谈一谈目录与路径的几个常用的指令:
- cd 变换目录
- pwd 显示目前的目录
- mkdir 创建一个新目录
- rmdir 删除一个里面是空的空目录
- cd 与 pwd
这两个指令主要是在『变换目前目录』与『显示目前所在目录』的工作,底下说一说他们的用途与语法吧!
- cd
语法:说明:
[root @test /root ]# cd [相对路径或绝对路径]
参数说明:
路径有『相对路径』与『绝对路径』的分别,请千万小心啰!
范例:
[root @test /root]# cd .. <==回到上一层目录
[root @test /root]# cd ../home <==相对路径的写法
[root @test /root]# cd /var/www/html <==绝对路径的写法
[root @test /etc]# cd <==回到用户的家目录
[root @test /etc]# cd ~ <==回到用户的家目录!
[root @test /etc]# cd ~test <==回到 test 这个用户的家目录
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
语法:说明:
[root @test /root ]# pwd
范例:
[root @test root]# cd /home/test
[root @test test]# pwd
/home/test <==显示目前你所在的目录呦!
pwd 是 print working directory 的缩写,也就是显示目前所在目录的指令,例如在上个表格最后的目录是 /home/test 这个目录,但是提示字符仅显示 test ,如果你想要知道目前所在的目录,可以输入 pwd 即可:
此外,由于很多的套件所使用的目录名称都相同,例如 /usr/local/etc 还有 /etc ,但是通常 Linux 仅列出最后面那一个目录而已,这个时候你就可以使用 pwd 来知道你的所在目录啰!免得搞错目录,结果……
- mkdir 与 rmdir 管理目录:
那么要如何创建删除目录呢?很简单呀!就用 mkdir 与 rmdir ,看出来了吗?没错啦!就是 make/remove directory 的缩写说!看要怎么用吧!
- mkdir
语法:说明:
[root @test /root ]# mkdir [-mp] [目录名称]
参数说明:
-m :设置文件的权限喔!直接设置,不需要看 umask 这个内容的脸色!
-p :帮助你直接将上面的目录递归创建起来!
范例:
[root @test /root]# cd tmp
[root @test /tmp]# mkdir test<==创建名称为 test 的目录
[root @test /tmp]# mkdir -p test1/test2/test3/test4 <==直接创建 test2...等上层目录
[root @test /tmp]# mkdir -m 711 testqq <==创建权限为 711 的目录!
[root @test /tmp]# ll test*
drwxrwxr-x 2 test test 4096 Feb 6 20:47 test/
drwxrwxr-x 3 test test 4096 Feb 6 20:48 test1/
drwx--x--x 2 test test 4096 Feb 6 20:48 testqq/
如果想要创建新的目录的话,那么就使用 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
语法:说明:
[root @test /root ]# rmdir [-p] [目录名称]
参数说明:
-p :将上层的目录也删除吧!
范例:
[root @test /root]# rmdir test<==删除名称为 test 的目录
[root @test tmp]# ll
drwxrwxr-x 3 test test 4096 Feb 6 20:48 test1/
[root @test tmp]# rmdir test1
rmdir: `test1': Directory not empty
[root @test tmp]# rmdir -p test1/test2/test3/test4
[root @test tmp]$ ll
如果想要创建删除旧有的目录时,就使用 rmdir 吧!例如将刚刚创建的 test 杀掉,使用 rmdir test 即可!请注意呦!目录需要一层一层的删除才行!而且被删除的目录里面必定不能还有其他的目录或文件!那如果要将所有目录下的东西都杀掉呢?!这个时候就必须使用 rm -rf test 啰!不过,还是使用 rmdir 比较不危险!不过,你也可以尝试以 -p 的参数加入,来删除上层的目录喔!
- 环境变量 PATH
在提过了绝对路径、相对路径与指令的下达方式之后,您应该会稍微注意到一件事情,那就是:『为什么我可以在 /root 底下运行 /bin/ls 这个文件呢?』对呀!为什么我可以直接运行 ls 就一定可以显示出一些消息而不会说找不到该文件呢?这是因为环境变量 PATH 的帮助所致呀!当我们在运行一个指令的时候,系统会依照 PATH 的设置去每个 PATH 定义的路径下搜索文件,先搜索到的指令文件先被运行之!现在,请下达 echo $PATH , echo 有『显示、印出』的意思,而 PATH 前面加的 $ 表示后面接的是变量,所以即会显示出目前的 PATH 了!
[root@test root]# echo $PATH
/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin
注意到了吗?对啦! /bin 在 PATH 的设置之中,所以自然就可以找的到 ls 啦!
- 如果你将 ls 移动到 /root 底下的话,然后你自己本身也在 /root 底下,但是当你运行 ls 的时候,他就是不理你?怎么办?这是因为 PATH 没有 /root 这个目录,而你又将 ls 移动到 /root 底下了,自然系统就找不到可运行档了,因此就会告诉你, command not found !那么该怎么克服这种问题呢?有两个方法,其一:直接将 /root 的路径加入 PATH 当中!如何增加?可以使用:
PATH=”$PATH”:/root
这种方式来增加即可!另一种方式则是使用完整文件名,亦即直接使用相对或绝对路径来运行,例如:
/root/ls
因为在同一个目录中,而我们又知道在同一个目录中的目录符号为『 . 』,因此,就以上面的 ./ls 来运行也可以!这种运行方式以后您应该会很常见到才对!
./ls
- 如果我有两个 ls 文件在不同的目录中,例如 /usr/local/bin/ls 底下与 /bin/ls 那么当我下达 ls 的时候,那个 ls 会被运行?那还用说,就找出 PATH 里面那个目录先被查找,则那个目录下的文件就会被先运行了!
- 咦!既然如此的话,那么为何不要在 PATH 里面加入 . 这个目录,如此一来的话,不就可以直接在所在目录运行文件了吗?因为 . 代表所在目录嘛!是这样没错!但是有没有想过,如果某天,某个怪怪的用户在 /tmp 里面写了一个 ls 的文件,偏偏他是有害的文件,那么当你在 /tmp 底下运行 ls 时,怎么办?!没错,可能会『中标』,所以啰,为了安全起见,不建议将『 . 』加入 PATH 的搜索当中!
谈了谈目录与路径之后,再来讨论一下关于文件的一些基本管理吧!文件与目录的管理上,不外乎『显示属性』、『拷贝』、『删除文件』及『移动文件或目录』等等,由于文件与目录的管理在 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 与 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 definitionsalias 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进位等等的数据格式!不过这个东西对于工程师可能比较有用啦!因为印出来的东西都是数字或内存当中的数据~~
由 Linux 文件属性 的内容我们可以知道一个文件有若干个属性,包括 ( r, w, x ) 等基本属性,及是否为目录 (d) 与文件 (-) 或者是链接档 (l) 等等的属性!那么要修改属性的方法在前面也约略提过了,这里再加强补充一下!此外,由于 Linux 还可以设置其他的系统安全属性,使用 chattr 来设置,而以 lsattr 来查看,最重要的属性就是可以设置其不可修改的特性!让连文件的拥有者都不能进行修改!这个属性可是相当重要的,尤其是在安全机制上面( security )!chown 改变文件的拥有人
chgrp 改变文件的所属群组
chmod 改变文件的可写、可读、可运行等属性
umask 改变缺省的创建文件或目录时的属性
chattr 改变文件的特殊属性
lsattr 显示文件的特殊属性!
- chown
语法:说明:
[root @test /root ]# chown [-R] user:group [目录名称]
参数说明:
-R :循环的将该目录下的所有文件都改成 user 与 group 的名称!
范例:
[root @test /root]# mkdir /home/test/testing <==在 /home/test 这个家目录中创建一个名为 testint 的子目录
[root @test /root]# cp * /home/test/testing
[root @test /root]# chown test /home/test/testing
[root @test /root]# chown -R test:test /home/test/testing<==将该目录下的所有目录或文件均变为 test 拥有
前一个章节才刚讲完,应该不会就这样忘记了吧?!由于 chown 的使用范围较广,所以这里再次的给他复习一下 chown 就好, chgrp 请回前一章内容观看呦!
记得文件有『拥有人』及『拥有群组』吧,这个 chown 就是在改变拥有者的指令。刚接触 Linux 的朋友最容易犯的一个错误在哪里呢?就是以 root 的身份 copy 一个文件(或路径)给一般用户(假设为 test )时,忘记将该文件的所有人改成 test 了!由于拷贝者是 root 所以该文件也会是 root 所有!那么 test 当然也就不能修改该文件了!
在上面的例子中,『 chown test /home/test/testing 』这个指令只会将该目录变成 test 的,但是 group 仍然是 root 的呦!所以你可以使用『 chown test:test /home/test/testing 』,连用户群组都给他改变一下啰!不过需要注意的是,这两个指令都只改变了『目录』 的所有权而已!那么在这个目录下的东西也要改变的话,该如何?!呵呵,就使用 -R 这个参数即可!
- chmod
语法:说明:
[root @test /root ]# chmod [-R] [parameter] [目录名称]
参数说明:
-R :循环的一直将该目录的文件均改变之!
范例:
[root @test /root]# chmod 777 .bashrc
还记得在『文件属性与系统』那一章吧!一个文件或目录至少有九个属性,三个三个一组,共分为三组!而可以使用数字来当作变换属性的参考依据!各属性如下:r:4举个例子来说,当一个属性为『-rwxr-xr--』时,那是几分呢?!我们可以将他看成如下『-[rwx][r-x][r--]』三组,所以分数就变成了『[4+2+1][4+0+1][4+0+0]』共有『754』分啦!这样会算吗?!OK!测试一下,底下的分数为几分:
w:2
x:1-r-xr-xr-x如果你可以算出『555』与『760』,呵呵!那么你就应该会算啰!所以,如果你要将 .bashrc 设置成所有人都可以读取的话,就下达『 chmod 777 .bashrc 』吧!其中需要特别注意的是,通常我们都会允许个人网页的设置!那么由于个人网页缺省是记录在/home/userID/public_html底下,偏偏 /home/userID 的属性为『drwx------』根本就不允许任何人进入!所以,你最少要将你的目录设置成 『drwx--x--x』 才可以!当然也可以设置成『drwxr-xr-x』!不过不建议设置成『777』呦!
-rwxrw----
- umask
OK!那么现在我们知道如何创建或者是改变一个目录或文件的属性了,不过,您知道当你创建一个新的文件或目录时,他的缺省属性会是什么吗?呵呵!那就与 umask 有关了!那么 umask 是在搞什么呢?基本上, umask 就是指定『目前用户在创建文件或目录时候的属性默认值』,那么如何得知或设置 umask 呢?他的指定条件以底下的方式来指定:
语法:说明:
[root @test root]# umask
0022
[root@vbird test]# umask 002 <==后面接 3 个数字!
[root@vbird test]# umask
0002
查看 umask 数值为直接输入 umask 即可,而设置呢?没错!就是 umask 之后接三个数字!那么如何来指定呢?主要还是跟 Linux 的文件属性(那九个属性, r, w, x )有关的,而且是以分数的那一个关系为例的,而有底下的规则为辅:
- 若用户创建为『文件』则缺省『没有可运行 ( x ) 项目』,亦即只有 rw 这两个项目,也就是最大为 666 分
--rw-rw-rw-- 若用户创建为『目录』,则由于 x 与是否可以进入此目录有关,因此缺省为所有权限均开放,亦即为 777 分
drwxrwxrwx
那么 umask 指定的是『该默认值需要减掉的权限!』因为 r、w、x 分别是 4、2、1 分,所以啰!也就是说,当要拿掉能写的权限,就是输入 2 分,而如果要拿掉能读的权限,也就是 4 分,那么要拿掉读与写的权限,也就是 6 分,而要拿掉运行与写入的权限,也就是 3 分,这样了解吗?请问您, 5 分是什么?呵呵!就是读与运行的权限啦!如果以上面的例子来说明的话,因为 umask 为 002 ,所以 user, group 并没有被拿掉属性,不过 others 的属性被拿掉了 2 ( 也就是 w 这个属性 ),那么由于当用户:
- 创建文件时:(-rw-rw-rw-) – (--------w-) ==> -rw-rw-r--
- 创建目录时:(drwxrwxrwx) – (--------w-) ==> drwxrwxr-x
不相信吗?你只要使用 touch test 然后看看这个 test 的文件属性,就可以知道了!那么如何看你这个用户目前的 umask 呢?直接下达 umask 即可!实作看看先:
[root@vbird test]# umask
0002
[root@vbird test]# touch test1
[root@vbird test]# mkdir test2
[root@vbird test]# ls -l
-rw-rw-r-- 1 root root 0 Oct 22 00:00 test1
drwxrwxr-x 2 root root 4096 Oct 22 00:00 test2/
发现了什么?呵呵! Test1 的属性为 666-002 = 664 !正确吗?是的!正确!
而 test2 这个目录呢?就是 777-002 = 775 !也正确![root@vbird test]# umask 003
[root@vbird test]# touch test3
[root@vbird test]# mkdir test4
[root@vbird test]# ll
-rw-rw-r-- 1 root root 0 Oct 22 00:03 test3
drwxrwxr-- 2 root root 4096 Oct 22 00:03 test4/
嘿!属性又跟刚刚的不一样啰!仔细推敲一下为什么呦!test3 666-003 =663,这是怎么一回事?! 663 应该是 -rw-rw--wx 才对啊!怎么会是上面的属性!呵呵!这里就要特别的给他强调了!『尽量不要以数字相加减啦!』容易造成类似上面的问题!你应该要这样想(-rw-rw-rw-) - (--------wx)=-rw-rw-r--这样就对啦!了解了吗?不要用十进位的数字喔!够能力的话,用二进位来算,不晓得的话,用 rwx 来算喔! ^_^
由上面的例子您应该很轻易的就可以发现 umask 的用途!而这个 umask 可以在 /etc/bashrc 里面进行修改喔!缺省的情况之下, root 的 umask 为 022 而一般用户则为 002 ,因为可写的权限蛮严重的,因此缺省都会拿掉这个权限!此外,因为 root 比较重要!所以为了安全的需求,其同群组的写入属性就被拿掉了!这东西对于安全性也有一定程度的贡献呦!
- chattr
语法:说明:
[root @test /root ]# chattr [+-=][ASacdistu] [文件或目录名称]
参数说明:
+-= :分别为 [+ 增加] [- 减少] [= 设置] 属性的意思
A :当设置了 A 这个属性时,这个文件(或目录)的访问时间 atime (access) 将不可被修改,
可避免例如手提式电脑容易有磁盘 I/O 错误的情况发生!
S :这个功能有点类似 sync 的功能!就是会将数据同步写入磁盘当中!可以有效的避免数据流失!
a :当设置 a 之后,这个文件将只能增加数据,而不能删除,只有 root 才能设置这个属性。
c :这个属性设置之后,将会自动的将此文件『压缩』,在读取的时候将会自动解压缩出来!
但是在保存的时候,将会先进行压缩之后再保存(看来对于大文件似乎蛮有用的!)
d :当 dump (备份)进程被运行的时候,设置 d 属性将可使该文件(或目录)具有 dump 功效!
i :这个 i 可就很厉害了!他可以让一个文件『不能被删除、改名、设置链接也无法写入或添加数据!』
对于系统安全性有相当大的助益!
j :当使用 ext3 这个文件系统格式时,设置 j 属性将会使文件在写入时先记录在 journal 中!
但是当 filesystem 设置参数为 data=journalled 时,由于已经设置了日志了,所以这个属性无效!
s :当文件设置了 s 参数时,他将会被完全的移除出这个硬盘空间。
u :与 s 相反的,当使用 u 来设置文件时,则数据内容其实还存在磁盘中,可以使用来 undeletion.
范例:
[root @test /root]# chattr +i /etc/shadow<==呵呵!如此则无法更动这个文件啰!
[root @test /root]# chattr -i /etc/shadow <==解除该属性!
这这个指令是重要的,尤其是在系统的安全性上面!由于这些属性是隐藏的性质,所以需要以 lsattr 才能看到该属性呦!其中,个人认为最重要的当属 +i 这个属性了,因为他可以让一个文件无法被更动,对于需要强烈的系统安全的人来说,真是相当的重要的!里头还有相当多的属性是需要 root 才能设置的呢!此外,如果是 log file 这种的注册表,就更需要 +a 这个可以增加,但不会被杀掉的参数了!怎样?很棒吧!未来提到注册表的认知时,我们再来聊一聊如何设置他吧!
- lsattr
语法:说明:
[root @test /root ]# lsattr [-aR]
参数说明:
-a :将隐藏档的属性也秀出来;
-R :连同子目录的数据也一并列出来!
范例:
[root @test /root]# chattr +i .bash_logout
[root @test /root]# lsattr -a
-------------- ./.
-------------- ./..
---i---------- ./.bash_logout
-------------- ./.bash_profile
-------------- ./.bashrc
-------------- ./.emacs
-------------- ./.screenrc
这两个指令在使用上必须要特别小心,例如:某天你心情好,突然将 /etc/shadow 这个重要的密码记录文件给他设置成为具有 i 的属性,那么过了若干天之后,你突然要添加用户,却一直无法添加!别怀疑,赶快去将 i 的属性拿掉吧!
文件的搜索可就厉害了!因为我们常常需要知道那个文件放在哪里,所以来谈一谈怎么搜索吧!在 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 啦!有更棒的指令可以取代呦!那就是 whereis 与 locate 啰!!
[test@test
test]$ ls -l /usr/bin/passwd
-r-s--x--x 1 root root 13476 Aug 7 2001 /usr/bin/passwd |
[test@test
test]$ ls -l /usr/bin/passwd /etc/shadow
-r-s--x--x 1 root root 13476 Aug 7 2001 /usr/bin/passwd -rw------- 1 root root 2423 Jun 25 14:29 /etc/shadow |
[test@test
test]$ ls -l /
drwxrwxrwt 2 root root 4096 Jul 18 13:08 tmp |
[root@test
tmp]# touch test
[root@test tmp]# ll total 0 -rw-r--r-- 1 root root 0 Feb 6 23:08 test [root@test tmp]# chmod 4755 test [root@vbird tmp]# ll total 0 -rwsr-xr-x 1 root root 0 Feb 6 23:08 test* [root@test tmp]# chmod 6755 test [root@test tmp]# ll total 0 -rwsr-sr-x 1 root root 0 Feb 6 23:08 test* [root@test tmp]# chmod 1755 test [root@test tmp]# ll total 0 -rwxr-xr-t 1 root root 0 Feb 6 23:08 test* 上面的三个例子应该都很好说明啊!就是直接将 x 以 s 或者是 t 来取代就是了!也就是分别为 SUID, SGID 及 sticky bit 的设置方法啦! [root@test tmp]#
chmod
7666 test
|
[root @test
/root ]# file [文件名]
参数说明: 范例: [root @test /root]# file ~/.bashrc /root/.bashrc: ASCII text <==表示这个文件是 ASCII 纯文本档 [root @test
/root]# file /usr/bin/passwd
|