美文网首页
知识点小结

知识点小结

作者: JevonWei | 来源:发表于2017-06-15 21:11 被阅读0次

    一、文件名通配符

    *:任意长度任意字符
    ?: 任意单个字符
    ~danran:danran用户家目录
    ~+:当前工作目录
    ~-:前一个工作目录
    [0-9]:匹配数字范围,只能匹配一个字符
    [a-z]:字母,不分大小写
    [A-Z]:字母,不区分大小写
    [dan]:匹配列表中的任何的一个字符
    [^dan]:匹配列表中的所有字符以外的字符
    [^]:匹配指定范围之外的任意单个字符
    []:匹配指定范围内的任意单个字符
        eg [abc],[a-m],[A-Z],[a-zA-Z],[0-9],[0-9a-zA-Z]
            [:space:]:水平或垂直空白字符
            [:blank:]:水平空白字符
            [:punct:]:标点符号
            [:print:]:可打印字符
            [:lower:]:小写字母
            [:upper:]:大写字母
            [:alpha:]:大小写字母
            [:digit:]:数字
            [:alnum:]:数字和大小写字母
            [:cntrl:]:控制(非打印字符)
            [:graph:]:图形字符
            [:xdigit:]:十六进制字符
            # man 7 glob 
    

    二、inode索引节点号

    inode (index node )表中包含文件系统所有文件列表
    一个节点(索引节点)是在一个表项,包含有关文件的信息(元数据 ),包括:

    文件类型,权限,UID ,GID
    链接数(指向这个文件名路径名称个数)
    该文件的大小和不同的时间戳
    指向磁盘上文件的数据块指针
    有关文件的其他数据
    目录的数据内容就是目录里面的文件列表,目录引用的是inode号,也就是目录下的文件名和文件inode号之间的映射

    • 节点编号是由分区分配的,不是由磁盘分配,在同一个分区中,不会存在相同的节点编号。
    • 节点编号是唯一的。但在不同的分区中,节点编号可以相同
    • 在centos7中,根上的目录文件的节点号都是64开始,centos6中,根上的目录文件的节点号为2,/sys、/proc文件在内存中,节点编号为1,节点编号是有限的

    当系统节点数被占用完时,再创建新文件会提示报错,节点编号是可以耗尽的

    • ls -i 查看文件的节点编号
    • df -i 查看磁盘分区上的可用节点号
    • whatch -n1 每秒扫描一次

    cp和inode号

    分配一个空闲的inode号,在inode表中生成新条目,在目录中创建一个目录项,将目录与inode编号关联拷贝数据生成新的文件
    在同分区移动文件时,仅移动目录的数据块信息,如果不是在同一个分区,则需要同事将节点编号和原数据同时移动。
    删除文件时,仅仅是先删除inode节点号,数据并不会删除,但在其他文件写入时,可能会覆盖占用被删除节点的数据空间

    rm和inode

    使用rm命令:
    1、链接数递减,从而释放的inode 号可以被重用
    2、把数据块放在空闲列表中
    3、删除目录项
    4、数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖。

    >mv和inode

    如果mv 命令的目标和源在相同的文件系统,使用mv命令
    1、用新的文件名创建对应新的目录项
    2、删除旧目录条目对应的旧的文件名
    3、不影响inode 表(除时间戳)或磁盘上的数据位置:没有数据被移动

    如果目标和源在一个不同的文件系统, mv相当于cp 和rm

    三、链接

    硬链接

    语法 :

    ln filename [linkname ]

    • 创建硬链接会增加额外的记录项以引用文件
    • 对应于同一文件系统上一个物理文件
    • 每个目录引用相同的 inode 号
    • 创建时链接数递增
    • 删除文件时:

      rm 命令递减计数的链接
      文件要存在,至少有一个链接数
      当链接数为零时,该文件被删除

    • 不能跨越驱动器或分区

    硬链接经常用于将同一个文件放在不同的目录下,从而便于访问,多个链接所在的空间为一个数据空间

    硬链接 ln a b       将a文件新建一个链接b    
    

    硬链接,更改其中一个文件,另一个文件会随之改变
    删除其中一个文件,另一个文件依然存在,但是链接数减一

    软链接

    语法:

    ln -s filename [linkname]

    一个符号链接指向另一个文件
    ls -l:显示链接的名称和引用的文件
    一个符号链接的内容是它引用文件的名称

    • 软链接文件使用不同的inode号,将原文件删除后,链接文件即失效,但是在将一个新文件复制到链接原文件路径下时,链接文件恢复正常,跟链接的文件内容无关,只能路径有关。
    • 链接文件的大小并不是原文件本身的大小,而是链接路径指向原文件的文件名字符所占字节的大小,即/tmp/dan文件名占八个字节。

    软、硬链接的区别

    硬链接

    1、硬链接必须在同一个分区中创建,不能跨分区,跨分区只能用软链接
    2、硬链接不支持对目录创建,硬链接不支持跨设备跨分区
    3、不复制原数据,仅分配一个inode号和文件名

    4、硬链接文件使用同一个inode号   
    5、硬链接工作的相对路径相对于当前目录   
    6、链接文件没有依赖性关系,链接数会加1   
    

    软链接

    1、可以对目录进行
    2、可以跨分区
    3、指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的引用计数;
    4、删除链接原文件,则链接指向失效
    5、软链接用相对路径时相对的不是当前工作目录,而是相对软链接工作路径

    四、重定向

    重定向衔接文件,只能导入到文件,管道 | 衔接命令,将输出导入到命令中
    标准输入输出

    Linux 给程序提供三种I/O 设备

    标准输入(STDIN )-0 默认接受来自键盘的输入
    标准输出(STDOUT )-1 默认输出到终端窗口
    标准错误(STDERR )-2 默认输出到终端窗口

    STDOUT 和STDERR 可以被重定向到文件:

    命令 操作符号 文件名
    支持的操作符号包括:

    >  把正确信息输出重定向到文件   
    2> 把错误信息输出重定向到文件   
    &> 把所有输出重定向到文件   
    
    >  文件内容会被覆盖
    >> 原有内容基础上,追加内容 
    

    set -C: 禁止将内容覆盖已有文件, 但可追加

    强制覆盖:>|

    set +C: 允许覆盖

    在脚本前面添加set -C可防止脚本被覆盖

    把输出和错误重新定向到文件

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

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

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

    合并标准输出和错误输出为同一个数据流进行重定向:

    &> :覆盖重定向
    &>> :追加重定向
    COMMAND > /path/to/file.out 2>&1 (顺序很重要)<====> &>
    COMMAND >> /path/to/file.out 2>&1

    正确信息输入到/app/all.log文件中,错误信息当成正确信息输入到/app/all,log文件中,也就是把错误信息也当做正确信息输出
    2>&1 <=====>|& 互为等价,都是将错误的信息转换为正确的输出,即没有错误都是正确,全部正确

    () :合并多个程序的STDOUT

    ( cal 2007 ; cal 2008 ) > all.txt

    • 重定向输入文件
      cat > q.txt

    将mail.txt文件中的内容邮件发送给danran用户
    mail -s hello danran < mail.txt 将mail.txt文件中的内容邮件发送给danran用户,hello为主题

    • 多行重定向:
      使用“<<终止词”命令从键盘把多行重导向给STDIN
      直到 终止词 位置的所有文本都发送给STDIN,<<终止词可以任意定义,终止词必须单独占用一行

    将 danran qqq aaa 输入到q文件

    cat << EOF > q
    danran
    qqq

    aaa
    EOF

    EOF 为起始输入端和终止输入端

    五、管道符 |

    • cmd1 | cmd2 将cmd1的标准输出作为cmd2的标准输入
    • 可以多级管道,多级管道需确定每一个管道都有标准输入和标准输出
    • 管道(使用符号“| ”表示)用来连接命令(传送给命令)

    命令1 | 命令2 | 命令3 | …

    将命令1 的STDOUT 发送给命令2 的STDIN ,命令2的 的STDOUT 发送到命令3 的STDIN
    STDERR 默认不能通过管道转发,可利用2>&1 或 |& 实现
    最后一个命令会在当前shell 进程的子shell 进程中执行用来

    组合多种工具的功能

    ls | tr 'a-z' 'A-Z'
    less/more:分页查看输入

    ls -l /etc | lsee/more

    mail:通过电子邮件发送输入

    echo “text email” | mail -s “test” user@example.com

    lpr:把输入发送给打印机

    echo “test print” | lpr -P priint_name

    • - (将前一个命令的标准输出做后一个命令的标准输出,可用作测试)

    tar -cvf - /home | tar -xvf -
    将home里面的文件打包,但打包得数据不是记录到文件,而是传送到stdout,经过管道后,将 tar -cvf - /home 传送给后面的 tar -xvf - , 后面的这个 - 就是取前一个命令的stdout,因此就不需要临时使用file了

    六、tee:重定向到多个目标

    命令1 | tee 文件名 | 命令2

    把命令1的STDOUT保存在文件名中,然后管道输入给命令2或输出在屏幕上
    使用:

    保存不同阶段的输出
    复杂管道的故障排除
    同时查看和记录输出

    相关文章

      网友评论

          本文标题:知识点小结

          本文链接:https://www.haomeiwen.com/subject/hziuqxtx.html