Linux 各种命令技巧

1. 想查看当前文件夹及子文件夹里有没有文件名为“abc”的文件

# find . -name abc

. :表示当前目录

-name:表示要根据名称查找

2. 想查看当前文件夹及子文件夹里有没有”xyz”目录

# find . -type d -name xyz

-type:表示设定类型,d表示文件夹类型,可以替换为f(普通文件)、l(链接文件)

3. 想找出当前文件夹及子文件夹里所有后缀是”.txt”的文件

# find . -name “*.txt”

4. 想查找当前目录及其子文件夹中“roc”用户自己的文件有哪些

扫描二维码关注公众号,回复: 1243275 查看本文章

# find . -user roc

-user:用于设定所属用户的名称,此处可替换为-group,即所属用户组的名称

5. 想查找当前文件夹及子文件夹里权限设定为755的所有文件

 

# find . -perm 755

-perm:用于设定权限

6. 想查找当前文件夹及子文件夹里的同时含有b字符和3字符的文件:用到正则表达式技术

# find . -regex ‘.*b.*3′

-regex:表示使用正则表达式进行匹配。请注意,此命令会和“全路径”进行匹配,也就是说前面要加.*,因为输出结果中会有“./”符号。

7. 如果想全部输出用find命令查找出的”*.abc”文件的内容

# find . -type f -name “*.abc” -exec cat {} \;

-exec 表示由find找到的匹配项会作为“-exec后面设定的命令”的参数

可以使用-ok代替-exec,这样对每个匹配项进行操作,都会要求用户确认(y为是,n为否)

命令最后的{} \; 别忘了写,其中{}代表用find查找到的结果中的每一个查找项。

8. 查找当前目录下在5分钟内被访问过的文件

# find . -amin -5

访问过用amin,修改过用mmin,文件状态改变过用cmin

精确到分钟的用amin,mmin,cmin,精确到天的用atime,mtime,ctime

在5分钟之内的用-5,在5分钟以上的用+5

9. 想查找当前目录及子目录下文件大小大于10M的所有文件

# find . -size +10000000c

-size:表示文件大小,+表示大于某个数,-表示小于某个数。c表示单位是字节,你可以将c换成k,M,G。

10. 上述所有的find命令都是查找当前目录及其子目录。如果不想深入到子目录中,而是只查找当前一层目录,则可以:

# find . -maxdepth 1 -name “*.c”

 

===============================================================

 

service命令,顾名思义,就是用于管理Linux操作系统中服务的命令。

1. 声明:这个命令不是在所有的linux发行版本中都有。主要是在redhat、fedora、mandriva和centos中。

2. 此命令位于/sbin目录下,用file命令查看此命令会发现它是一个脚本命令。

3. 分析脚本可知此命令的作用是去/etc/init.d目录下寻找相应的服务,进行开启和关闭等操作。

4. 开启httpd服务器:service httpd start

start可以换成restart表示重新启动,stop表示关闭,reload表示重新载入配置。

5. 关闭mysql服务器:service mysqld stop

6. 强烈建议大家将service命令替换为/etc/init.d/mysqld stop

==========================================================

 

du命令:disk usage,顾名思义,是关于目录使用情况的。对了~ 它的作用就是计算目录大小的。

1.

想看当前目录下所有目录以及子目录的大小:

# du -h .

“.”代表当前目录下。也可以换成一个明确的路径

-h表示用K、M、G的人性化形式显示

2.

只想看当前目录下abc目录的大小,并不想看其他目录以及其子目录:

# du -ch abc | tail -n 1

此种方法需要管道技术来管道du和tail两个命令来实现。

-c表示最后计算出所有所列目录的大小之和

# du -sh abc

-s表示总结的意思,即只列出一个总结的值

# du -h –max-depth=0 abc

–max-depth=n表示只深入到第n层目录,此处设置为0,即表示不深入到子目录。

3.

列出abc目录及其子目录下所有目录和文件的大小:

 

# du -ah abc

-a表示包括目录和文件

4.

列出所有abc目录中的目录名不包括xyz字符串的目录的大小:

# du -h –exclude=’*xyz*’

5.

想在一个屏幕下列出更多的关于abc目录及子目录大小的信息:

# du -0h abc

-0(杠零)表示每列出一个目录的信息,不换行,而是直接输出下一个目录的信息。

 

===========================================================

 

chkconfig在命令行操作时会经常用到。它可以方便地设置各个系统运行级别启动的服务。这个可要好好掌握,用熟练之后,就可以轻轻松松的管理好你的启动服务了。

  • 想列出系统所有的服务启动情况:

    # chkconfig –list

  • 想列出mysqld服务设置情况:

    #chkconfig –list mysqld

  • 设定mysqld在等级35为开机运行服务:

    # chkconfig –level 35 mysqld on

    –level 35表示操作只在等级35执行

    on表示启动,off表示关闭

  • 设定mysqld在各等级为on

    # chkconfig mysqld on

    各等级”包括2345等级

    等级0表示:表示关机

    等级1表示:单用户模式

    等级2表示:无网络连接的多用户命令行模式

    等级3表示:有网络连接的多用户命令行模式

    等级4表示:不可用

    等级5表示:带图形界面的多用户模式

    等级6表示:重新启动

  • 如何增加一个服务:

    首先,服务脚本必须存放在/etc/ini.d/目录下;

    其次,需要用chkconfig –add servicename来在chkconfig工具服务列表中增加此服务,此时服务会被在/etc/rc.d/rcN.d中赋予K/S入口了。

    最后,你就可以上面教的方法修改服务的默认启动等级了。

  • 删除一个服务:

    # chkconfig –del servicename

     

    ==========================================================

     

    • uname -a 打印所有系统信息

    • uname -s 打印内核名称

    • uname -n 打印网络节点主机名

    • uname -r 打印内核发信版本号

    • uname –help 获得帮助信息

    • 查看系统版本号的方法还有:

      • cat /proc/version

      • cat /etc/redhat-release

      • cat /etc/issue

         

        =====================================================

         

         

        tr指令从标准输入设备读取数据,经过字符串转译后,输出到标准输出设备。

        cat filename |tr u n :用于在屏幕上将filename文件中的u替换为n,而实际文件中未作替换

        cat filename | tr -d abc 在屏幕上将filename内容中的所有出现的a或b或c字符删去,并显示出来

        cat filename|tr [:lower:] [:upper:] 将文件内容中的小写全部变为大写

        类似于[:lower:]的代替符号还有:

        [:alnum:] 表示所有的字母和数字

        [:alpha:] 表示所有的字母

        [:blank:] 表示所有空格

        [:digit:] 表示所有数字

        [:graph:] 表示所有可打印字符,但不包括空格

        [:print:] 表示所有可打印字符,包括空格

         

        =====================================================

         

        转移到linux之后的一大痛苦就是压缩和解压缩,今天的主题是“压缩和解压工具gzip”。

        五分钟教会你linux压缩和解压大法~~

        1 下载了一个源码文件abc.tar.gz或abc.tgz(后缀tar.gz和tgz基本没啥区别,相同的还有.taz和.tar.Z)

        # tar -xzvf abc.tar.gz 或

        # tar -xzvf abc.tgz

        注释:

        tar.gz和tgz是经过归档并由gzip工具压缩之后所得到的压缩包。

        x选项表示解压缩

        z表示用gzip工具进行解压缩

        v表示在解压缩时显示详细信息

        f表示指定文件(请注意,这个选项一定要放在各个选项的最后哦~~,也就是要和所指定的文件名挨得最近哦)

        2 遇到一个文件xyz.gz,想解压缩:

         

        # gzip -d xyz.gz

        注释:d选项表示解压缩

        3 遇到一个文件edf.tar,想解压缩:(严格的讲tar文件是归档文件,并未被压缩,这里提到的“解压缩”只是将tar文件拆开而已):

        # tar -xvf edf.tar

        注释:其实这个命令不是压缩命令范畴,只是在这里提一下:)

        4 想将一个文件夹dirabc压缩成.tar.gz的压缩文件:

        # tar -czvf dirabc.tar.gz dirabc

        5 想查看一下下载的abc.tar.gz压缩文件里包含哪些文件

        # tar -ztvf abc.tar.gz

        6 用5的方法查看到abc.tar.gz压缩包,其中包括def/xyz.txt文件等很多文件,但只想提取出xyz.txt这一个文件

        # tar -xzvf abc.tar.gz def/xyz.txt

        7 解压abc.tar.gz时我想保留原来被压缩文件的权限(常用于备份)

        # tar -xzvpf abc.tar.gz

        8 我想压缩得最快,代价是压缩比最高

        # gzip -1 abc.tar

        注释:-1也可以换成–fast;-9表示压缩比高,但速度最慢,-9也可以用–best代替。默认的是-6(数字不好记的话,可以这样记:1表示一步到位,往往一步到位的东西追求的是快,而不是精致程度 ^_^)

         

        =====================================================

         

        并不是所有的linux压缩包都是.tar.gz的(请相信我^_^),你还会发现有一类文件的后缀是.tar.bz2的(这也是真的)。此时,bunzip2命令就派上用场了。

        在开始讲解之前,有一点必须要说明,bunzip2和bzip2的关系。如果你在fedora下工作,你会发现bunzip2是bzip2的一个符 号连接。但bunzip2和bzip2的功能却正好相反。bzip2是用来压缩文件的(当然如果使用特殊函数也是可以用来解压,用选项-d可以实现),而 bunzip2是用来解压文件的(相当于bzip2 -d)。类比,还有zip和unzip、gzip和gunzip、compress和uncompress。

        下面来看看它的使用:

        1 当你下载了一个文件为roc.tar.bz2时,该怎么解压它呢

        # tar -xjvf roc.tar.bz2

        注释:j选项表示采用bunzip2工具。(yegle说可以省略j,即不特殊指定压缩工具,只用-xvf。这是也正确的^_^)

        2 我有一个文件abc.txt,我想用bunzip2压缩工具进行压缩!

        #bzip2 abc.txt

        注释:压缩后会得到一个压缩文件abc.txt.bz2,同时原abc.txt会被删除。(这点很重要哦,linux考试会问到这一点)

        3 如果有一个文件abc.txt.bz2,想解压缩:

        #bunzip2 abc.txt.bz2

        注释:解压后会得到abc.txt,而原abc.txt.bz2会被删除。

        4 如果我想压缩abc1.txt,abc2.txt,abc3.txt三个文件,还有dir1和dir2目录,共5个部分,一起压缩到five.bz2中:

        #bzip five.bz2 abc1.txt abc2.txt abc3.txt dir1 dir2

        5 如果有abc1.txt.bz2和abc2.txt.bz2两个文件,我想用一个命令把两个文件分别解压为abc1.txt和abc2.txt:

        # bunzip2 abc1.txt.bz2 abc2.txt.bz2

        6 如果有abc1.txt和abc2.txt两个文件,我想用一个命令把两个文件分别压缩为abc1.txt.bz2和abc2.txt.bz2:

        # bzip2 abc1.txt abc2.txt

         

        =========================================================

        zip命令可以用来将文件压缩成为常用的zip格式。unzip命令则用来解压缩zip文件。

        1. 我想把一个文件abc.txt和一个目录dir1压缩成为yasuo.zip:

        # zip -r yasuo.zip abc.txt dir1

        2.我下载了一个yasuo.zip文件,想解压缩:

        # unzip yasuo.zip

        3.我当前目录下有abc1.zip,abc2.zip和abc3.zip,我想一起解压缩它们:

        # unzip abc\?.zip

        注释:?表示一个字符,如果用*表示任意多个字符。

        4.我有一个很大的压缩文件large.zip,我不想解压缩,只想看看它里面有什么:

        # unzip -v large.zip

        5.我下载了一个压缩文件large.zip,想验证一下这个压缩文件是否下载完全了

        # unzip -t large.zip

        6.我用-v选项发现music.zip压缩文件里面有很多目录和子目录,并且子目录中其实都是歌曲mp3文件,我想把这些文件都下载到第一级目录,而不是一层一层建目录:

        # unzip -j music.zip

         

        ==============================================

        通俗的讲,作业控制命令是用来控制一个一个任务的。

        1 我想把updatedb命令(用于重新建立整盘索引的命令)放在后台运行。因为我不想眼睁睁的看着机器建立索引,我还想编会儿程序呢:

        # updatedb &

        [1] 23336

        注释:在所要执行的命令后面加上空格,再加上&符号即可实现后台执行。所返回的[1]表示这是第一个你放到后台的任务。23336是这个任务的进程号。

         

        2 我执行updatedb时忘了加&了,这下我怎么办?有办法:

        按键盘上的ctrl-z组合键,可以将前台任务扔到后台!但务必注意的是,用ctrl-z的话,这个任务到了后台可是stopped的状态。(你都无情的把它ctrl-z到后台了,它怎么可能还会任劳任怨的继续在后台工作呢?)

        3 我学会了这招,我把很多程序都放到后台执行了。我想查看一下:

        # jobs

        [1]+  Running                 updatedb &

        注释:显示出了正在后台运行的任务的列表

        4 我编程结束了。想把刚才的updatedb放回前台看看。

        # fg %1

        注释:fg中的f就表示front,前台的意思。%1表示是在jobs命令中列出的1号任务。如果是2号任务呢,我猜你知道如何写。

        5 如果你用jobs命令发现有一个显示[stopped]的任务(任务号是2),我想让这个任务继续在后台执行:

        # bg %2

        注释:stopped的状态通常出现在用户ctrl-z之后。

        6 我想让后台的任务号是3的任务取消:

        # kill %3

        注释:这样就杀死了任务号为3的后台任务。


        =================================================

        今天编程,关于栈的一个小例子,其间我需要把”S.”替换为”S->”(替换不包括双引号)。

        其实这个不难,不过我觉得应该总结一下vi里的替换技术了,以备以后查阅。

         

        1

        所有替换方案都要在冒号“:”状态下书写。

        2

        如果想将abc替换为xyz,那么就这样

        :s/abc/xyz/

        不过要特别注意,这个替换只局限于光标所在当前行,而且更糟糕的是它只替换当前行的第一个匹配项。

        即,如果此行内容为I write abc, I read xyz and abc. 那么替换后的结果为I write xyz, I read xyz and abc.

        3

        如果想将一行里的所有匹配都进行替换,那么就这样:

        :s/abc/xyz/g

        4

        如果想将一行里所有的”S.”替换为”S->”,那么就这样:

        :s/S\./S->/g

        例如,此行S.abc and S->bcd and S.aaa and S..abc为,替换后为S->abc and S->bcd and S->aaa and S->.abc

        此处因为点号“.”为特殊匹配符,所以如果想匹配点号,就需要用\放在点号前面,表示取消点号的特殊意义。

        5

        如果要扩大替换范围,则可以用行数来限制:

        如果要替换全文的S.为S->,则:

        :1,$s/S\./S->/g

        可以看出在s前面加上m,n则表示行的范围,1表示第一行,$表示最后一行。当然你完全可以指定其他行数。

        此处,m或n可以用特殊符号”.”或”$”代表,”.”代表当前行,”$”代表最后一行

        如果是确定为全文替换,那么可以用%来代替1,$,即:%s/S\./S->/g

        6

        你可能会发现如果我要匹配一个http://roclinux.cn/index.php会很麻烦阿 因为//符号和/符号都会把替换搞乱。此时,你完全可以用#或者其他任何符号来替换/,如s/abc/xyz/可以替换为s#abc#xyz#,或者s!abc!xyz!都是可以的!这个是不是很神奇,如果你了解perl的话,你会发现更多非常非常灵活的技巧。呵呵

        如此行内容为:http://roclinux.cn/index.php and http:/uuw/faf

        使用如下替换命令(此处使用了#):

        :s#http://roclinux\.cn/index\.php#http://www\.sohu\.com#

        替换后为:http://www.sohu.com and http:/uuw/faf

        7

        如果我希望把具有日期格式(XXXX-XX-XX)的字符串两侧加上一对单引号,即2008-07-01变成’2008-07-01′,可以这样做。

        例如,原来文件内容为:

        aaa 2008-07-01 bbb
        ccc 2008-07-12 aaa

        使用如下替换命令:

        :1,$s/\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\)/’\1′/g

        替换后为:

        aaa ’2008-07-01′ bbb
        ccc ’2008-07-12′ aaa

        这个替换命令比较复杂,里面有这几个知识点:

        第一个知识点:[0-9]表示0到9之间的任一个数字

        第二个知识点:\{n\}表示将此符号前面的元素重复n遍,所以[0-9]\{4\}就表示一个四位数的数字

        第三个知识点:如果在匹配方案中用到了\(\)则表示要暂存这个匹配内容,而\1就表示要替换为暂存的匹配内容,你仔细看看我给出替换命令,就可以懂了,我们匹配的如果是2008-07-01,那么加了括号后就会被暂存,而在后面的\1处就会被替换过来,外面再加一对引号,就OK了!

        ps:进阶替换还是建议看看perl骆驼书。


        ======================================================

        1 我想知道我机器安装了哪些shell?
        两种方法可以查看:

        第一种:

        [rocrocket@wupengchong ~]$ chsh -l
        /bin/sh
        /bin/bash
        /sbin/nologin
        /bin/zsh

        第二种:

        [rocrocket@wupengchong ~]$ cat /etc/shells
        /bin/sh
        /bin/bash
        /sbin/nologin
        /bin/zsh

        其实chsh -l也是来查看这个文件。

        2 我想知道我当前正在使用的shell是哪个阿?

        [rocrocket@wupengchong ~]$ echo $SHELL
        /bin/bash

        注意SHELL一定要是大写。可以看到,我目前使用的shell是/bin/bash

        3 执行了zsh之后,我查看当前shell类型仍然是/bin/bash呢?

        请注意,我们虽然执行了zsh,但是所谓“当前的shell”是一个大环境的概念,是针对一个已登录的用户而言的。而我们执行zsh只是启动了一个zsh的解释器程序而已,并没有改变大环境。如果想改变“当前的shell”,那么还是要使用chsh才可以。

        4 我想把我的shell改成zsh!

        [rocrocket@wupengchong ~]$ chsh -s /bin/zsh
        Changing shell for rocrocket.
        Password:
        Shell changed.
        [rocrocket@wupengchong ~]$

        使用chsh加选项-s就可以修改登录的shell了!

        你会发现你现在执行echo $SHELL后仍然输出为/bin/bash,这是因为你需要重启你的shell才完全投入到zsh怀抱中去。

        5 chsh -s到底是修改了哪里?

        秘密告诉你吧。chsh -s其实修改的就是/etc/passwd文件里和你的用户名相对应的那一行。现在我来查看下:

        [rocrocket@wupengchong ~]$ cat /etc/passwd|grep ^rocrocket
        rocrocket:x:500:500:rocrocket,China:/rocrocket/PSB/home:/bin/zsh

        看!你可以发现输出内容的最后部分已经变成了/bin/zsh了!下次你重启的时候,linux就会读取这一命令来启动你的shell了!

        好了,我要恢复正常工作,把shell修改会我熟悉的/bin/bash了!

        [rocrocket@wupengchong ~]$ chsh -s /bin/bash
        Changing shell for rocrocket.
        Password:
        Shell changed.

         

        =====================================================

        1 我想立即关机!

        $shutdown -h now

        2 我想立即重启

        $shutdown -r now

        3 我想在23:30分准时关机

         

        $shutdown -h 23:30

        4 我想在15分钟后关机

        $shutdown -h +15

        5 总结一下,你可以看到,如果想让shutdown干活,你必须告诉shutdown命令一个时间,无论是now,还是23:30,还是+15。

        6 我想来个恶作剧!

        恶作剧,就是吓唬用户。这个功能其实很实用,如果你是管理员,你完全可以利用“恶作剧”提醒所有登录的用户,让他们尽快退出程序,你要关机了。

        来看看怎么搞“恶作剧”:

        $shutdown -k now “Server would shutdown in 15minutes\!”

        看到了吧 加上-k选项就可以了 这样shutdown命令就知道这个命令只是一个恶作剧,不会真去关机的。shutdown会将你设定的消息字符串发给已登录的所有用户,这样就起到了提示的作用。试试-k吧!take it easy!

         

        ====================================================

        在阅读本文之前,我假设你已经对Linux系统下的硬盘、光盘的设备命令规则有所了解,比如sda和sda1的关系,以及hda、sda、fd、cdrom等设备。

        ===

        1 我把U盘插到USB口上了,下一步我该如何做才能查看U盘里的内容?

         

        我不能确定你的Linux系统会不会自动加载。所以,你应该先去/media目录下查看一下,看看是不是已经自动加载上了。如果是的话,应该在/media里有一个目录,名字类似于disk,你进入目录就等于进入你的U盘了。

        如果/media没有你想要的东西,那就要自己mount了!

        $mkdir /mnt/usb

        $mount -t vfat /dev/sda /mnt/usb

        这样就可以了,你去/mnt/usb目录看看,应该有你想要的了。如果mount命令不管用,那么你可以将/dev/sda改成/dev/sdb或者/dev/sdc试试!

        -t选项用于设定文件系统类型,我假设你的U盘是fat32的。(因为大部分U盘都是这样的)如果是其他文件系统,你可以man mount来查看一下,方法类似。

        2 我把光盘放到光驱里了,下一步咋办?

        如果系统没有自动加载光驱的话,那么用下面命令一般有效:

        $mkdir /mnt/cdrom

        $mount -t iso9660 /dev/cdrom /mnt/cdrom

        3 我下载了一个pes6.iso文件,我怎么加载iso文件呢?

        $mount -o loop pes6.iso /mnt/cdrom

        使用-o选项和loop参数即可!

        4 我下载了10个iso文件,从fifa2000.iso到fifa2009.iso,但是当我mount到fifa2007.iso时,就提示不让我mount了!怎么解决?

        这个涉及到mount -o loop的原理了。你查看一下/dev下的以loop开头的文件,你就会发现:

        [rocrocket@wupengchong dev]$ ls /dev/loop*
        /dev/loop0  /dev/loop2  /dev/loop4  /dev/loop6
        /dev/loop1  /dev/loop3  /dev/loop5  /dev/loop7

        这下知道了吧,原来在/dev里只预设了8个加载iso的地方。

        解决办法是这样的:

        可以先用modinfo命令查看loop信息:

        [root@wupengchong ~]# modinfo loop
        filename:       /lib/modules/2.6.26.5-45.fc9.i686/kernel/drivers/block/loop.ko
        alias:          block-major-7-*
        license:        GPL
        srcversion:     7595F5D46DFDB4A2D489DDD
        depends:
        vermagic:       2.6.26.5-45.fc9.i686 SMP mod_unload 686 4KSTACKS
        parm:           max_loop:Maximum number of loop devices (int)
        parm:           max_part:Maximum number of partitions per loop device (int)

        可以看出max_loop来限制最大loop的数目。而max_part用来设定每个loop的设备所能支持的分区数目。

        你还可以看到控制loop的是一个内核模块:/lib/modules/2.6.26.5-45.fc9.i686/kernel/drivers/block/loop.ko。

        我们的目标就是修改max_loop值。

        $echo “options loop max_loop=20″>>/etc/modprobe.conf

        然后就是要重新加载内核模块,这样来做:

        [root@wupengchong ~]# modprobe -l|grep loop.ko
        /lib/modules/2.6.26.5-45.fc9.i686/kernel/drivers/block/cryptoloop.ko
        /lib/modules/2.6.26.5-45.fc9.i686/kernel/drivers/block/loop.ko
        [root@wupengchong ~]# modprobe -r loop
        [root@wupengchong ~]# modprobe loop

        注意modprobe命令的选项-r表示remove,即删除某个模块。

        好了,就此我们重新加载了loop模块,你现在再用ls /dev/loop*看看,是不是已经有20个loop设备了。

        5 我知道/etc/fstab文件里的内容是开机时加载的所有设备,那么mount能利用这个文件么?

        可以利用,你直接执行mount -a就可以了,mount会乖乖的按照/etc/fstab文件的内容来加载所有的设备。

        6 我这里有不同的文件系统,我用mount加载时需要注意什么?

        需要在mount时加-t来设定文件系统类别:

        如果是fat的,就要-t vfat;

        如果是linux的ext系统的,就要-t ext或-t ext2或-t ext3,未来会有-t ext4;

        如果是光驱,那就是-t iso9660;

        如果文件系统是ntfs,那么你可能需要了解一下ntfs-3g这个软件了。

        7 我有一个老的三寸软盘,如果mount?

        $mount -t vfat /dev/fd0 /mnt/floppy

        8 mount除了加载设备,还可以做什么?

        mount可以用来装载支持acl的分区。具体可查询mount和acl。

        mount可以用来设定ftp登录目录,用–bind参数可以实现。

        mount可以设定和修改已加载的文件系统的属性,具体可查看mount的-o参数。

         

        =============================================

        大家在刚接触linux的时候,都会使用man来查阅一些命令的帮助信息。但是也都只是使用“man 命令名称”这样简单的格式。其实,man还有不少其他小技巧,在这和大家分享一下。

        1 当你列出write时,它可能代表了Linux里的用户命令或系统调用,如果我只是想了解write这个系统调用的作用,而对write命令的命令格式没有兴趣,那么我该如何告诉man呢?

        man命令后面可以加一个数字参数,表示具体的范围定位:

         

        数字“1”表示用户命令

        数字“2”表示系统调用

        数字“3”表示C语言库函数

        数字“4”表示设备或特殊文件

        数字“5”表示文件格式和规则

        数字“6”表示游戏及其他

        数字“7”表示宏、包及其他杂项

        数字“8”表示系统管理员相关的命令

        知道了这些,我就可以用man 2 write来查看关于write系统调用的帮助信息了。

        再举几个例子,比如你man named,你观察屏幕左上角会发现NAMED(8)的字样,这就说明这个named是包含在“系统管理员相关的命令”之中的。

        再比如man yum.conf,你会发现yum.conf(5) ,我想你现在应该知道它的寓意了。下次你可以直接man 5再加一个配置文件,来查查这个文件的配置方法了。

        2 给大家推荐一个man的非常好的网站,http://www.linuxmanpages.com/,在这里有非常全的Linux的man信息,你可以分1-8来查看相应的manual page!

        3 我的这些man信息都存在Linux系统的哪里?

        [root@wupengchong ~]# manpath
        /usr/kerberos/man:/usr/local/share/man:/usr/share/man/en:/usr/share/man

        用manpath命令就可以看到了,当你man的时候,man会到如上这些路径去寻找对应的帮助信息。如果没有的话,那么man会抱怨:

        [root@wupengchong ~]# man rocrocket
        No manual entry for rocrocket

        呵呵

        4 如何重新建立man的数据库?

        使用makewhatis命令就可以!

        5 既然有man数据库,我是否可以像搜索引擎那样搜出里面的关键字?

        可以。这样做:

        $man -k roc

        使用man的-k选项,就可以列出所有包含roc字符串的man帮助信息。

        其实,更深一步,man -k和apropos命令作用相同。你完全可以用apropos roc来代替man -k roc。

        其实apropos是一个脚本文件,它不是ELF可执行文件。所以你完全可以用vi /usr/bin/apropos看看它到底是如何实现都。呵呵

         

        ====================================================

        今天的内容是Linux的wc命令,这个名字很好记,因为什么,你也知道。

        这个命令的功能也很好记,因为它功能很有限:

        wc -c filename:显示一个文件的字节数

         

        wc -m filename:显示一个文件的字符数

        wc -l filename:显示一个文件的行数

        wc -L filename:显示一个文件中的最长行的长度

        wc -w filename:显示一个文件的字数

        [rocrocket@rocrocket programming]$ cat wc1.txt
        1 2
        34 5
        你好
        [rocrocket@rocrocket programming]$ wc -c wc1.txt
        16 wc1.txt
        [rocrocket@rocrocket programming]$ wc -m wc1.txt
        12 wc1.txt
        [rocrocket@rocrocket programming]$ wc -l wc1.txt
        3 wc1.txt
        [rocrocket@rocrocket programming]$ wc -L wc1.txt
        4 wc1.txt
        [rocrocket@rocrocket programming]$ wc -w wc1.txt
        5 wc1.txt

        每行结尾的换行符也算一个字符,空格也算一个字符。

        由于采用UTF-8编码,所以一个汉字在这里被转换为3字节,所以wc -c显示的结果是16,即“第一行的4个字节+第二行的5个字节+第三行的7个字节”=4+5+7=16。

        而当使用-m选项时,一个汉字就作为一个字符计算,所以是4+5+3=12。

        当使用-L时,是给出最长行的长度,第二行最长,有4个字符长。(显然是不把换行符计算在内)

        使用-w是计算字数,一个字是一个word,所以“34”表示一个word,一个“你好”表示一个word,因此2+2+1=5。

        插孔说说tab制表符,这个符号比较特殊,当使用-L时,制表符算7个字符(这要依据一个制表符的长度而定,在我的系统中一个制表符算7个空格长度)。而当使用-w时,制表符和空格没有两样,都作为字的间隔来看待。当用-c时,一个制表符也就算一个字符,因为它的确就只是一个字符而已。

        如果你直接执行wc wc1.txt,则显示:

        [rocrocket@rocrocket programming]$ wc wc1.txt
        3  5 16 wc1.txt

        输出信息依次是:行数 字数 字节数 文件名称。

         

        ======================================================

        ln是一个很神奇的命令,它可以创建一个文件的影子,也可以通过一个通道进入另一个地方。:)其实,所有的这些把戏都是通过软连接和硬连接实现的。

        我们假设你已经阅读了“硬连接和软连接的原理-《别怕Linux编程》之七”这篇文章,并且对其原理有比较透彻的认识。下面开始ln命令的情景举例吧!

         

        1 我想建一个source.txt文件的硬链接,名字取做linksource.txt

        [rocrocket@wupengchong test]$ cat source.txt
        Hello!Source!
        [rocrocket@wupengchong test]$ ll source.txt
        -rw-rw-r– 1 rocrocket rocrocket 14 2008-10-23 09:25 source.txt
        [rocrocket@wupengchong test]$ ln source.txt linksource.txt
        [rocrocket@wupengchong test]$ ll -i source.txt linksource.txt
        1178119 -rw-rw-r– 2 rocrocket rocrocket 14 2008-10-23 09:25 linksource.txt
        1178119 -rw-rw-r– 2 rocrocket rocrocket 14 2008-10-23 09:25 source.txt

        可以看到,我们建立硬链接的命令格式是“ln 目标 链接名称”,我们用ln source.txt linksource.txt来建立了一个source.txt文件的硬链接。之后,我们用ll -i,即ls -li命令来查看了文件的信息,其中-i选项表示列出每个文件的inode节点ID,我们可以发现source.txt和linksource.txt的inode号是完全一样的,都是1178119,这就说明它们都指向同一个数据块。这就是硬链接。

        但要注意,硬链接不允许跨分区来建立,也就是不允许跨文件系统来建立,即使是同一类型的文件系统也是不行的。所以硬链接只能在一个分区内建立。

        2 我想建立一个source.txt文件的软链接,名字叫做softsource。

        [rocrocket@wupengchong test]$ ln -s source.txt softsource
        [rocrocket@wupengchong test]$ ll -i source.txt softsource
        1178211 lrwxrwxrwx 1 rocrocket rocrocket 10 2008-10-23 09:32 softsource -> source.txt
        1178119 -rw-rw-r– 2 rocrocket rocrocket 14 2008-10-23 09:25 source.txt

        可以看到,建立软链接也是使用ln命令,但是必须加上-s选项,建立软链接的命令格式为“ln -s 目标 链接名称”。之后我们可以使用ls命令可以查看到软链接softsource和source.txt的inode号是不一样的,这说明他们完全指向两个不同的数据库快。而且,细心的朋友能够观察到软链接文件的权限栏首字符为l,这也是软链区别于普通文件的地方之一。

        如果这个时候,我们删除了source.txt文件,则软链接softsource就会编程红色字体,这表示警告,这是一个有问题的文件,它无法找到它所标识的文件source.txt了。

        3 刚才的两个例子都是链接文件的,那链接目录呢,我想试试!

        [rocrocket@wupengchong test]$ ln tempdir linkdir
        ln: `temp’: hard link not allowed for directory

        我想硬链接一个目录tempdir,但是报错了!是的,硬链接是不允许链接到目录的。(待会儿来分析原因,少安毋躁)

        [rocrocket@wupengchong test]$ ln -s temp linkdir

        目录的软链接的建立是允许的,看,我建立了一个temp目录的软链接linkdir,以后我完全可以cd linkdir来进入temp目录了。像这样:

        [rocrocket@wupengchong test]$ cd linkdir/
        [rocrocket@wupengchong linkdir]$ ls
        a001.txt  a002.c  a.out  sixunhuan.c
        [rocrocket@wupengchong linkdir]$ cd ../temp/
        [rocrocket@wupengchong temp]$ ls
        a001.txt  a002.c  a.out  sixunhuan.c
        [rocrocket@wupengchong temp]$

        我们来查看下这两个目录的属性信息:

        [rocrocket@wupengchong test]$ ll|grep -E “temp|linkdir”
        lrwxrwxrwx 1 rocrocket rocrocket     4 2008-10-23 09:49 linkdir -> temp
        drwxr-xr-x 2 rocrocket rocrocket  4096 2008-08-07 16:08 temp

        可以看到linkdir是软链接,而temp是一个目录。

        4 为什么ln不允许硬链接到目录,而允许软链接到目录呢?

        这个问题,我在网上找到了很好的解答。这位朋友解释的很清晰。(我实在无法找到如下文章的出处以及原作者信息,故无法标识原作者信息,如有知情者,可速与我联系,我会及时加入作者信息。谢谢)

        linux系统中的硬连接有两个限制:不能跨越文件系统和不允许普通用户对目录作硬连接。至于第一个限制,很好理解,而第二个就不那么好理解了。 我们对任何一个目录用ls -l 命令都可以看到其连接数至少是2,这也说明了系统中是存在硬连接的,而且命令ln -d 也可以让超级用户对目录作硬连接,这些都说明了系统限制对目录进行硬连接只是一个硬性规定,并不是逻辑上不允许或技术上的不可行。那么操作系统为什么要进行限制呢?

        如果引入了对目录的硬连接就有可能在目录中引入循环,那么在目录遍历的时候系统就会陷入无限循环当中。也许您会说,符号连接不也可以引入循环吗,那么为什么不限制目录的符号连接呢?原因就在于在linux系统中,每个文件(目录也是文件)都对应着一个inode结构,其中inode数据结构中包含了文件类型(目录,普通文件,符号连接文件等等)的信息,也就是说操作系统在遍历目录时可以判断出符号连接,既然可以判断出符号连接当然就可以采取一些措施来防范进入过大的循环了,系统在连续遇到8个符号连接后就停止遍历,这就是为什么对目录符号连接不会进入死循环的原因了。但是对于硬连接,由于操作系统中采用的数据结构和算法限制,目前是不能防范这种死循环的。

        5 ln命令里面有一个-n选项,它的官方解释是这样的:-n, –no-dereference  treat destination that is a symlink to a directory as if it were a normal file. 请问这是什么意思阿?

        在水木上有类似的一个帖子,jianingy给出了一个清晰的例子,如下:

        第一步:mkdir a b
        第二步:ln -sf a c (这个时候c -> a)
        第三步:如果执行ln -sf b c,那么会在c目录“里面”创建一个b的symbolic link,但很明显这不是你的本意。
        如果把第三步替换成:ln -snf b c 那么结果就变成了c->b

         

        ======================================================

         

猜你喜欢

转载自duchengjiu.iteye.com/blog/1752751