文件系统高级操作
重定向
C语言程序一般会打开三个缺省文件,stdin、stdout、stderr,文件描述符分别是0,1,2。
在Unix系统中,文件是io的基本抽象。标准输入、标准输出、错误输出可以替换为其它文件。
标准输出重定向
- command > file
- command >> file 追加
标准输入重定向
- command < file
- command << EOF 标准输入,当碰到EOF字符串时,输入结束
标准错误输出重定向
-
command 2> file 将command的错误输出重定向到file文件
-
command 2>> file 追加重定向
重定向标准输出+标准错误输出
command &> file
command &>> file 追加重定向
特别文件
/dev/null bit垃圾桶
command > /dev/null
Cat命令与重定向
cat > myfirst
cat >> myfirst
cat myfirst > mysecond
cat myfirst mysecond > mythird
cat > myfirst << EOF
管道
shell将一个程序的标准输出作为另一个程序的标准输入,形成管道(pipeline)
- command A | command B
- 注意两条命令之间是以一个匿名文件传输
- ls –al | grep -e “^d”
- ls -al | less
Shell如何实现管道?
•pipe()函数创建一个两个文件描述符,一个输入,一个输出
•fork
•主要的问题是:如何将父进程的标准输出替换为pipe输出,子进程的标准输入替换为pipe输入
参考:http://www.rozmichelle.com/pipes-forks-dups/
文件操作
cp拷贝源文件成目标文件
- -b 如果目标文件存在备份~
- -i 如果目标文件存在,提示
- -r 递归拷贝
mv移动文件
- -b 如果目标文件存在,则备份~
- -i 如果目标文件存在,提示
- -f 强制移动
wc统计字数
短选项 | 长选项 | 功能 |
---|---|---|
-l | –lines | 统计行数 |
-w | –words | 统计单词数量 |
-c | –chars | 统计字符数量 |
–help | 帮助 |
head显示文件头部
缺省显示头部10行
短选项 | 长选项 | 功能 |
---|---|---|
-n | –lines=n | 显示头部n行 |
-c n | –chars=n | 显示头部n个字符 |
–help | 帮助 | |
–version | 版本号 |
tail显示文件尾部
缺省是尾部10行
短选项 | 长选项 | 功能 |
---|---|---|
-n | –lines=n | 显示尾部n行 |
-c n | –chars=n | 显示尾部n个字符 |
–help | 帮助 | |
–version | 版本号 |
cut命令纵向输出文件的某个列
短选项 | 长选项 | 功能 |
---|---|---|
-f LIST | –fields=LIST | 指定剪切的域 |
-d x | –delimiter=x | 指定域的分隔符 |
-c LIST | –characters=LIST | 指定剪切字符位置 |
–help | 帮助 |
LIST为如下形式:
- n-m 表示[n,m]的域
- n,m 表示n和m域
缺省分隔符是TAB制表键
paste命令横向连接两个文件
短选项 | 长选项 | 功能 |
---|---|---|
-d x | –delimiters=x | 指定域分隔符 |
–help | 帮助 |
•缺省分隔符为TAB制表符
more命令分页显示文件内容
可以向后翻,但不能向前翻。less命令是more的改进,可以向前翻
sort命令排序按照行做字典序排列文件内容
选项 | 功能 |
---|---|
-b | 忽略行首的空格 |
-d | 在字典序比较中,忽略标点符号和控制符号 |
-t | 指定域分隔符 |
-n | 数字以数值排序 |
-r | 逆序排列 |
-o | 指定输出文件 |
按照字典序,大写字母比小写字母更靠前
sort /etc/passwd
按照uid排列所有用户
sort -t : -n +2 /etc/passwd
grep命令搜索字符串
打开文件,在文件中以RE方式搜索字符串:grep [OPTION…] PATTERNS [FILE…]
短选项 | 长选项 | 功能 |
---|---|---|
-c | –count | 只显示匹配的行数 |
-i | –ignore-case | 忽略大小写匹配 |
-G | –basic-regexp | BRE,grep缺省 |
-E | –extended-regexp | ERE,egrep缺省 |
-e PATTERNS | –regexp=PATTERNS | 指定一个或多个RE |
-v | –invert-match | 显示不匹配的行 |
-n | –line-number | 输出行号 |
xargs
•xargs [command [initial-arguments]]
•xargs从标准输入上读,将标准输入文件按照空格/TAB拆解成参数,作为command执行参数。
查找epoll_wait函数在那个文件:find /usr/include –name “*.h” -type f | xargs grep “epoll_wait”
文件系统原理
Unix三大抽象
- 进程、线程对执行过程
- 文件对io
- 地址空间对内存
Unix四种io
文件系统、块设备、字符设备、socket
- 块设备和字符设备出现在文件系统的名字空间
- Socket仅表现为文件
Unix文件系统
堆+索引
•索引 key→value,key是文件名,要求变长,
•inode叫做索引节点号,这是Linux文件系统管理文件的方式。在建立文件系统时,会建立一个索引节点表,里面包含一定数量的索引节点。每当建立一个文件时,就会为他分配一个索引节点号,相当于文件的地址。
目录文件→i-node → data;ls –i显示节点
链接文件
ln [OPTION]… [-T] TARGET LINK_NAME
- ln命令不会创建新的i-node,而是引用已有i-node,增加引用计数,与普通文件没什么不同
- ln –s符号链接,分配一个新的inode,内部记录指向原有文件,类似于Windows的快捷方式
软连接(符号链接)与硬连接的应用场景:
- 硬链接:防止因为误操作而错误删除文件
- 符号链接:方便管理;解决文件系统磁盘空间不足的情况