知识点小结

一、文件名通配符

*:任意长度任意字符
?: 任意单个字符
~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” [email protected]

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或输出在屏幕上
使用:

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

你可能感兴趣的:(知识点小结)