一、文件名通配符
*:任意长度任意字符
?: 任意单个字符
~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或输出在屏幕上
使用:保存不同阶段的输出
复杂管道的故障排除
同时查看和记录输出