I/O 重定向:
什么是重定向:先了解几个概念:标准输入(即从键盘输入),标准输出(即从显示屏输出),标准错误(就是错误信息error,也是标准输出到显示屏上)
那么重定向呢? 其实就是更改它的标准输入输出错误模式,比如说标准输出到文件中,就把本该在显示屏上的东西,添加到一个文件中,文件的内容就是本在显示屏上的东西。
(数字表示:0表示标准输入,1表示标准输出,2表示标准错误)
输出重定向:
> : 覆盖 >> : 追加
输出正确内容: > / >> 等价于 1> / 1>>
输出错误内容: 2> / 2 >>
正确和错误的内容都输出到相同位置: &> (混合输出) , 2>&1
区别:
输出到空设备: > /dev/null (/dev/null 文件相当于一个无底洞,就相当于丢弃)
输出重定向:
< 等价于 0<
组合使用:
eg: cat > test.txt <<EOF (可以试试哈,EOF可以随便写,表示输入的结束)
管道: |
管道就是把一个进程的标准输出作为一个进程的标准输入
eg: ps -ef | grep httpd #选择httpd 的进程
匿名管道和命名管道:
咱们就简单理解就行,普通的管道一般都是匿名管道,他会随着进程的结束而结束,是一个血缘的进程通信,一个半双工通信方式等
比如 ps -ef | grep httpd 这个例子,ps -ef 就相当于父进程, grep httpd 就相当于子进程,他就只能从父进程到子进程
命令管道(FIFO)
FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存储于文件系统中。命名管道是一个设备文件(就是上篇文章中讲到的管道文件,可以使用ll 命令来查看),因此,即使进程与创建FIFO的进程不存在亲缘关系,也是半双工通信,只要可以访问该路径,就能够通过FIFO相互通信。值得注意的是,FIFO(first input first output)总是按照先进先出的原则工作,第一个被写入的数据将首先从管道中读出
如何创建命名管道?
在Linux系统下,命名管道可由两种方式创建(假设创建一个名为“fifoexample”的有名管道):
( 1)mkfifo("fifoexample","rw");
( 2)mknod fifoexample p
mkfifo是一个函数,mknod是一个系统调用
tee 管道:
就直接上图了
tee命令就像管道的T接头。将STDIN的数据同时发送到两个目的地。一个是STDOUT,一个是指定 的文件名
文件查找:which, locate,find(重要)
which:
查找可执行文件的路径
什么意思呢?简单理解就是which之能查找命令的路径
locate:
相当于find -name ,但是比find 的速度快,因为locate是从数据库中直接查询的,而find是从通过遍历磁盘来查找
whereis:
参数说明:
-b : 只找二进制文件
-m: 只找在说明文件manual路径下的文件
-s : 只找source源文件
-u : 没有说明文档的文件
whereis 也是直接从数据库中查询,速度也是很快的
find (重要的一个)
用法: find 路径 参数
Eg: find / -name test.txt
(从 / 开始查找test.txt的文件)
相关参数:
时间查找参数:
-atime n :将n*24小时内存取过的的文件列出来
-ctime n :将n*24小时内改变、新增的文件或者目录列出来
-mtime n :将n*24小时内修改过的文件或者目录列出来
-newer file :把比file还要新的文件列出来
与使用者或组名有关参数:
-gid n :寻找群组ID为n的文件
-group name :寻找群组名称为name的文件
-uid n :寻找拥有者ID为n的文件
-user name :寻找用户者名称为name的文件
-nouser :寻找文件的拥有者不存在 /etc/passwd 的人!
-nogroup :寻找文件的拥有群组不存在于 /etc/group 的文件!
-name :按照名字查询
-size: 按照大小查询
-exec
1.参数是一个一个传递的,传递一个参数执行一次rm
2.文件名有空格等特殊字符也能处理
-xargs
1.一次将参数传给命令,可以使用-n控制参数个数
2.处理特殊文件名需要采用如下方式:
find . -name "*.txt" print0 |xargs -0 rm {}