Linux基础知识--3.Linux目录和文件相关命令和Linux基础特性(2)

Linux中有许多基本操作命令,一些基本的操作命令在Linux后期学习中发挥很大的作用,因此能熟练的理解,掌握和应用这些基本的命令是后期学习的关键。在这根据命令的使用情况进行以下分类:

    1.目录管理命令;

    2.文本文件查看命令;

    3.文件的时间戳管理工具;

    4.文件管理命令;

    5.文本处理工具;

    6.系统管理命令;

在将上述基本命令讲述完之后,再来看看Linux基础特性(2)。Linux基础特性将涉及到命令别名的设置、字符通配、快捷键等。接下来详细的介绍这些内容;(自己理解,大神勿喷)

一.基本命令:

  1.目录管理命令:

    Linux的目录结构是树状目录,目录有相对目录和绝对目录。

    linux的绝对目录是从/目录开始写起,到当前目录的全称,利用pwd命令就可以查看当前目录的绝对目录

    linux的相对目录是相对于目前工作目录的路径。

    其中有一些特殊目录如下:

    .表示当前目录

    ..表示上一级目录

    ~表示当前登录用户的家目录

    cd命令:切换目录命令

    pwd命令:显示当前目录

    tree命令:列出目录的垂直结构:

      常用选项:

        -d:只显示出目录,不显示目录下的文件

        -L #:指定显示出的层级数

        -P pattern:显示出pattern匹配到的内容

    目录的创建命令:mkdir

      命令格式:

        mkdir [OPTION]... DIRECTORY...

      常用选项:

        -p:创建目录时如果父目录不存在,则连父目录一起创建   

        -v:详细显示创建目录的过程

        eg:

        # mkdir -pv  /tmp/{kk,zz}/{a,c}
        mkdir: created directory `/tmp/kk'
        mkdir: created directory `/tmp/kk/a'
        mkdir: created directory `/tmp/kk/c'
        mkdir: created directory `/tmp/zz'
        mkdir: created directory `/tmp/zz/a'
        mkdir: created directory `/tmp/zz/c'

        -m MODE:创建目录时,指定所创建目录的权限

    删除空目录:rmdir(注意:删除空目录)

      命令格式:

        rmdir [OPTION]... DIRECTORY...

      常用选项:

        -p:连同上一级的空目录一起删除:

        -v:显示删除过程;        

        rmdir -pv /etc/kk/{a,c}
        rmdir: removing directory, `/tmp/kk/a'
        rmdir: removing directory, `/tmp/kk'
        rmdir: failed to remove directory `/tmp/kk': Directory not empty
        rmdir: removing directory, `/tmp/kk/c'
        rmdir: removing directory, `/tmp/kk'
        rmdir: removing directory, `/tmp'
        rmdir: failed to remove directory `/tmp': Directory not empty

      也可以用命令rm -rf DIRECTORY 删除目录,即使不是目录不是空目录也会删除。但千万不要执行

      rm -rf /* 这个命令,我想学习Linux的同学都知道这是什么意思!!

     关于执行文件路径的变量:$PATH

       用root用户的身份查询$PATH 路径结果:   

    # echo $PATH
    /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bi
    n:/root/bin

     PATH变量的内容是由一堆目录所组成的,每个目录中间用冒号来隔开,每个目录是由顺序之分的

  2.文本文件查看类命令:

    文本文件查看类涉及的命令有:cat,tac,more,less,tail,head

    cat:从第一行显示文件内容

      常用选项:

        -n:打印出行号

    tac:从最后一行开始显示文件内容

    more:成页显示文件内容

     在more打开一个文件后,会有一些快捷翻页按键:

        1.空格键:向下翻一页

        2.Enter键:向下滚动一行

        3.b:向前翻一页

        4./string:代表在more显示的内容中,向下显示string这个关键字

        5.q:退出more

    less:与more类似

      less的用法比more更有弹性,其中man手册中的操作方法就是利用less命令,也有一些快捷键:

        1.空格,Ctrl+V,Ctrl+f,Ctrl+F:向文件尾部翻屏

        2.b Ctrl+B:向文件首部翻屏

        3.d Ctrl+D:向文件尾部翻半屏

        4.u Ctrl+U:向文件首部翻半屏

        5.Enter Ctrl+N e j  Ctrl+E Ctrl+J:向文件尾部翻一行

        6.y k Ctrl+y Ctrl+P:向文件首部翻一行

        7.q:退出

        8.#:跳转至#行

        9.G到行尾,1G到行首

        等。详细的选项查看man手册使用方法。

    head:默认查看文件的前10行:

      命令格式:

        head [OPTION]... FILE...

      常用选项:

        -c #:查看文件的前#个字节

        -n #:查看文件的前#行

      实例:  

      #head -n 5 /etc/passwd
      root:x:0:0:root:/root:/bin/bash
      bin:x:1:1:bin:/bin:/sbin/nologin
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


    tail:默认查看文件的后10行:

      命令格式:

        tail [OPTION]... FILE...

      常用选项:    

        -c #:查看文件的后#个字节

        -n #:查看文件的后#行

        -f:一直查看文件新追加的内容:例如查看日志文件。按Ctrl+c退出

      实例:

     # tail -n 5 /var/log/messages 
     Aug 21 23:27:24 localhost bluetoothd[1542]: HCI dev 0 up
     Aug 21 23:27:24 localhost bluetoothd[1542]: Starting security manager 0
     Aug 21 23:27:24 localhost bluetoothd[1542]: Parsing /etc/bluetooth/serial
     .conf failed:
     No such file or directory
     Aug 21 23:27:24 localhost bluetoothd[1542]: ioctl(HCIUNBLOCKADDR): Invali
     d argument (22)
     Aug 21 23:27:24 localhost bluetoothd[1542]: Adapter /org/bluez/1528/hci0
     has been enabled

  3.文件的时间戳管理工具:

    每个文件在linux下面都会记录三个主要修改时间:

      access time(atime):最近文件访问时间,读取文件的内容时,此时间就会发生修改,比如使用cat查看文件内容时。

      modification time(mtime):当文的内容更改时,就会更新这个时间,而不是文件的属性或权限。

      change time(ctime):最近文件改变时间,改变文件元数据,像文件的权限与属性被更改了,这个时间见就会发生变化。

    使用touch命令来修改时间戳或者创建一个不存在的文件:

      命令格式:

        touch [OPTION]... FILE...

      常用选项:

        -a:仅修改访问时间(atime)

        -c:修改文件的时间,假如文件不存在则不创建文件。

        -m:修改mtime

        -d:使用指定的日期时间,而非现在的时间

      当我们去用命令cat 查看一个文件内容时,可用命令stat + filename 查看文件的access time 发生了变化同理,当我们用vim打开一文件内容并做相应的修改,则mtime也会发生改变,ctime和access也会随之变化,当对一个文件进行修改权限和属性时,文件的ctime会发生变化。如以下实例:

       有一个文件a.txt 三种初始时间戳为:     

       # stat a.txt         
       File: `a.txt'
       Size: 49        Blocks: 8          IO Block: 4096  
        regular file
       Device: fd00h/64768dInode: 262164      Links: 1
       Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: ( 
          0/  root)
       Access: 2015-08-18 23:28:19.598932488 +0800
       Modify: 2015-08-18 23:28:04.483931823 +0800
       Change: 2015-08-18 23:28:04.486931725 +0800

       我们使用命令cat来查看文件内容如:cat a.txt。然后使用命令stat来查看a.txt的时间戳    

        # stat a.txt   (在这只给出了时间戳信息)   
        Access: 2015-08-22 08:53:49.724189593 +0800
        Modify: 2015-08-18 23:28:04.483931823 +0800
        Change: 2015-08-18 23:28:04.486931725 +0800

      会发现只有Access的时间发生了改变,其他没有发生变化。我们在修改文件的内容,来查看修改之后时间戳的变化:       

        # echo hello" > a.txt
        # stat a.txt        
        Access: 2015-08-22 08:53:49.724189593 +0800
        Modify: 2015-08-22 08:59:44.778186361 +0800
        Change: 2015-08-22 08:59:44.778186361 +0800

      会发现Modify时间发生改变,Change也发生改变。而atime没有发生改变,是因为我们没有打开查看文件,只是通过命令echo向文件追加内容。假如我们使用vim打开文件并做相应的修改,则三种时间都会发生改变我们再用命令chmod修改文件的权限,查看文件a.txt的ctime是否改变:       

        # chmod +x a.txt   
        # stat a.txt     
        Access: 2015-08-22 09:00:25.013189719 +0800
        Modify: 2015-08-22 09:00:25.013189719 +0800
        Change: 2015-08-22 09:09:33.291184015 +0800

      命令执行后会发现文件a.txt的ctime发生了改变。

  4.文件管理命令:

    文件管理命令涉及到文件的复制、粘贴和删除,分别是cp、mv、rm命令

    1.cp命令:

      命令使用格式:    

       cp [OPTION]... [-T] SOURCE DEST

   cp [OPTION]... SOURCE... DIRECTORY

   cp [OPTION]... -t DIRECTORY SOURCE...

     (1)cp SOURCE DESR

        如果目标文件不存在,将会新建DEST,并将SRC中的内容填充至DEST中

        如果目标文件存在:

            如果DEST是文件:将SOURCE中的内容覆盖至DEST中,为了数据的安全此时

        建议使用-i选项

            如果DEST是目录:在DEST下新建与源文件同名的文件,并将SOURCE中的内容

        填充新的文件中

     (2)cp SOURCE...  DEST

        如果SOURCE为多个文件:则DEST必须存在且为目录。其他情形均会出错。

     (3)cp SOURCE DEST

        SOURCE 是目录:此时要用-r选项:

            如果DEST不存在:则创建指定目录,复制SRC目录中的所有文件至DEST中;

            如果DEST不存在;

              如果是DEST是文件,报错

              如果DEST是目录:直接把SOURCE复制到DEST中.

      常用选项:

        -i:交互模式,提示覆盖时会有所提示。

        -f:强制复制

        -r/-R:递归复制目录及文件

        -d: --no-dereference --preserve=links复制符号连接

        -a/-dr|R:--preserve=all 递归复制并保存源文键的相关属性

        -l:对源文件建立硬链接,而非复制源文件

        -s:对源文键建立软连接,而非复制源文件

      实例:      

       # cp -r /etc/sysconfig/network-scripts/ /tmp/network/
       [root@localhost etc]# ls -l /tmp/network/
       total 204
       -rw-r--r-- 1 root root   158 Aug 22 10:12 ifcfg-eth1
       -rw-r--r-- 1 root root   254 Aug 22 10:12 ifcfg-lo
       lrwxrwxrwx 1 root root    20 Aug 22 10:12 ifdown -> ../../../sbin/ifdown
       -rwxr-xr-x 1 root root   627 Aug 22 10:12 ifdown-bnep
       -rwxr-xr-x 1 root root  5511 Aug 22 10:12 ifdown-eth
       -rwxr-xr-x 1 root root   781 Aug 22 10:12 ifdown-ippp
       -rwxr-xr-x 1 root root  4168 Aug 22 10:12 ifdown-ipv6
       [root@localhost ~]# cp -s a.txt c.rlink
       lrwxrwxrwx  1 root root     5 Aug 22 10:08 c.rlink -> a.txt
       [root@localhost ~]# cp -l a.txt c.link
       [root@localhost ~]# ll
       -rw-r--r--  1 root root    12 Aug 22 10:05 c.link

  5.文本处理命令:

    文本处理命令有wc、cut、sort、uniq

    wc命令:wc - print newline, word, and byte counts for each file

      命令格式:

        wc [OPTION]... [FILE]...

      常用选项:

        -l:显示行数

        -w:显示单词数

        -c:显示字符数

    sort命令:对文件内容进行排序

      命令格式:

        sort [OPTION]... [FILE]...

      常用选项:

        -r:逆序排列

        -n:按数值大小排序

        -f:忽略字符大小写

        -k#:以指定字段为标准进行排序

        -t#:指定分隔符

        -u:uniq:排序后去重。相同的只显示一次

    cut命令:文本切割命令

      命令格式:

        cut OPTION... [FILE]...

      常用选项:

        -d:指定分隔符。默认为空格

        -f#:选定定第#字段

          使用格式为:

            -f#:

            -f#,#,..:离线的多个字段

            -f#-#:连续多个字段

        --output-delimiter=STRING:选定自己指定的分隔符

        eg:

        cut -d: -f1,7 /etc/passwd --output-delimiter="@"         
        root@/bin/bash
        bin@/sbin/nologin
        daemon@/sbin/nologin

    uniq命令     

    注意:连续且完全相同方为重复:

      常用选项:

        -c:显示每行重复的次数

        -d:只显示重复的行

        -u:只显示不曾重复的行

    

二.Linux基础特性二:

 1.命令别名(alias)

    alias:显示当前shell进程所有可用的命令别名

    定义别名:

      alias NAME='VALUE'

      在命令模式下定义的别名,仅对当前shell进程有效, 要想永远有效需要修改配置文件

      对当前用户有效:~/.bashrc

      对多有用户有效:/etc/bashrc

      然后重新读取配置文件,就会立即生效:source ~/.bashrc

    撤销别名:

      unalias name

    如果在没有撤销别名时,要执行原命令用:/COMMAND

  2.glob:字符通配:

    man 7 glob

    bash 中用于实现文件名通配的通配符有:

      *、?、[]

      *:任意长度的任意字符

      ?:任意单个字符

      []:匹配指定范围内的任意单个字符

      [^]:匹配指定范围之外的字符

      专用字符集合:

        [:digit:]:任意数字,相当于0-9

        [:lower:]:任意小写字母

        [:upper:]:任意大写字母

        [:alpha:]:任意大小写字母

        [:alnum:]:任意数字或字母

        [:space:]:空格字符

        [:punct:]:标点符号

   练习:

  1.显示/var目录下多有l开头,以一个小写字母结尾,中间出现至少一位数字的文件或目录

    ls -d /var/l*[0-9]*[[:lower:]]

  2.显示/etc/目录下,以任意一位数字开头,且以非数字结尾的文件或目录

    ls -d /etc/[0-9]*[^[:digit:]]

  3.显示/etc/目录下,以非字母开头,后面跟了一个字母及其其他任意长度任意字符的文件或目录

    ls -d /etc/[^[:alpha:]][[:alpha:]]*

  4.复制/etc/目录下,所有以m开头,以非数字结尾的文件或目录至/tmp/mageedu目录中

    cp -a /etc/m*[^[:digit:]] /etc/mageedu

  5.复制/etc/目录下,所有以.d结尾的文件或目录至/tmp/mageedu目录中;

    cp -a /etc/*.d  /tmp/magedu.com

  6.复制/etc/目录下,所有以.conf结尾的文件,且m,n,r,p开头的文件或目录复制到/tmp/mageedu

    cp -a /etc/[mnrp]*.conf /tmp/mageedu.com


  3.bash的快捷键:   

    Ctrl+l:清屏:相当于命令clear

    Ctrl+a:跳转到命令行的开始处

    Ctrl+e:跳转到命令行的结尾处

    Ctrl+u:删除命令行首至光标所在处的所有内容

    Ctrl+k:删除光标所在处至命令行尾的所有内容

  4.bash的I/O重定向和管道

    程序是由指令和数据组成:程序执行时需要读入数据和程序执行后把数据输出

    数据的输入和输出一般是从键盘输入数据,在屏幕上输出数据

    读入数据:Input,输出数据:Output

    打开一个文件都有一个fd:file descriptor:内核来访文件。文件描述符是非负数。打开现存文件或新文件时,内核会返回一个文件描述符。读取文件也需要使用文件描述符来指定待读写的文件。

    标准输入:0

    标准输出:1

    标准错误输出:2

    

    I/O重定向:就是改变标注输入和输出的位置。

    1.输出重定向:COMMAND > NEW_POSITON  COMMAND >> NEW_POS

        >:覆盖重定向,目标文件中的原有内容会被清楚

        >>:追加重定向,新内容将会追加至目标文件尾部

        set -C:禁止将内容覆盖输出至已有文件中。

            强制覆盖:>|

        set +C:取消上述操作

        2>:覆盖重定向错误输出数据流:

        2>>:追加重定向错误输出数据流            

            标准输出和错误输出各自定向至不同的位置:    

            COMMAD > /path/to/file.out 2> /path/to/error.out

            将标注输出和错误输出至同一个文件中:(有两种方法:)

            &>:覆盖重定向

            &>>:追加重定向

                1.COMMAND &> /path/to/file.out

                2.COMMAND > /path/to/file.out 2>&1

    2.输入重定向:<

        实例:

        cat << EOF

        cat > /tmp/shell << EOF

    3.管道|:把上一个命令的执行结果当做下一个命令的执行参数

        tr命令:转换或删除字符:

            cat a.txt | tr 'a-z' 'A-Z'

        tee命令:

          tee [option].. [file]..

        把要内容显示在屏幕上又保存到文件中

        # echo $PATH  | tr 'a-z' 'A-Z' | tee /tmp/path

    实例:   

    1.# head -n 5 /etc/passwd | tr 'a-z' 'A-Z'  > /tmp/passed.out

    2.# who | tail -n 2 | tr 'a-z' 'A-Z' > /tmp/who.out