Linux 文件名通配和管道
xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具
一般和管道一起使用
参数
-
-a file 从文件中读入作为sdtin
-
-e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
-
-p 当每次执行一个argument的时候询问一次用户。
-
-n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
-
-t 表示先打印命令,然后再执行。
-
-i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
-
-r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
-
-s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数。
-
-L num 从标准输入一次读取 num 行送给 command 命令。
-
-l 同 -L。
-
-d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。
-
-x exit的意思,主要是配合-s使用。。
-
-P 修改最大的进程数,默认是1,为0时候为as many as it can ,这个例子我没有想到,应该平时都用不到的吧。
1 将找到的信息放到cp 和 最终目录中间
find /oldboy -type f -name "*.txt"|xargs -i cp {} /oldgirl
02. 利用cp指明谁是数据最终保存的目录信息
find /oldboy -type f -name "*.txt"|xargs cp -t /oldgirl
03 将找到的信息放到cp 和 最终目录中间
find /oldboy -type f -name "*.txt"|xargs -i mv {} /oldgirl
04 利用cp指明谁是数据最终保存的目录信息
find /oldboy -type f -name "*.txt"|xargs mv -t /oldgirl
删除大于7天的数据
find /backup -type f -mtime +7|xargs rm
{} 生成组合序列
[root@oldboyedu tmp]# echo {A,B}{01,02} A01 A02 B01 B02 [root@oldboyedu tmp]# echo A{01,02} A01 A02 [root@oldboyedu tmp]# echo A{,02} A A02
快速备份文件数据方法
[root@oldboyedu tmp]# # cp /oldboy/oldboy.txt /oldboy/oldboy.txt.bak [root@oldboyedu tmp]# echo oldboy.txt{,bak} oldboy.txt oldboy.txtbak [root@oldboyedu tmp]# echo oldboy.txt{,.bak} oldboy.txt oldboy.txt.bak [root@oldboyedu tmp]# echo /oldboy/oldboy.txt{,.bak} /oldboy/oldboy.txt /oldboy/oldboy.txt.bak [root@oldboyedu tmp]# cp /oldboy/oldboy.txt{,.bak} --最终命令
如何将备份文件快速还原
rm /oldboy/alex.txt -f mv /oldboy/alex.txt{.ori,}
文件名通配
匹配模式:元字符
*:匹配任意长度的任意字符
- ls /etc/pa* 匹配 /etc 下以 pa 开头的所有文件
?:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
- [a-z]=[A-Z]不区分大小写, [0-9], [a-z0-9]
- [[:upper:]]:所有大写字母
- [[:lower:]]:所有小写字母
- [[:alpha:]]:所有字母
- [[:digit:]]:所有数字
- [[:alnum:]]:所有的字母和数字
- [[:space:]]:所有空白字符
- [[:punct:]]:所有标点符号
- [^]:匹配指定范围外的任意单个字符(取反)
强化小练习
1 显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现一位任意字符的文件或目录
ls -d /var/l?[[:lower:]]
2:复制/etc目录下,所有以m开头,以非数字结尾的文件或目录至/tmp/magedu.com目录
cp -r /etc/m*[^0-9] /tmp/magedu.com/
3:复制/usr/share/man目录下,所有以man开头,后跟一个数字结尾的文件或目录至/tmp/man/目录下
cp -r /usr/share/man/man[0-9] /tmp/man/
4:复制/etc目录下,所有以.conf结尾,且以m,n,r,p开头的文件或目录至/tmp/conf.d/目录下
cp -r /etc/[mnrp]*.conf /tmp/conf.d/
IO重定向及管道
程序:指令+数据
程序:IO
可用于输入的设备:文件
- 键盘设备、文件系统上的常规文件、网卡等;
可用于输出的设备:文件
- 显示器、文件系统上的常规文件、网卡等;
程序的数据流有三种
- 输入的数据流;<-- 标准输入(stdin),键盘;
- 输出的数据流:--> 标准输出(stdout),显示器;
- 错误输出流: --> 错误输出(stderr),显示器;
fed: fil descriptor,文件描述符
- 标准输入:0
- 标准输出:1
- 错误输出:2
IO重定向
输出重定向:>
- 特性:覆盖输出 (慎用)
输出重定向:>>
- 特性:追加输出
基于存在覆盖输出情况, 可以使用 set -C 禁用覆盖已存在的文件
#此时可使用强制覆盖输出:>| set -C
关闭上述特性
set +C
错误输出流重定向
- 2>, 2>>
合并正常输出流和错误输出流
- (1)&>, &>>
- (2) COMMAND > /path/to/somefile 2>&1 (1代表的是标准输出)
输入重定向:<
[root@oldboyedu oldboy]# echo oldboy >/oldboy/info.log 2>&1 [root@oldboyedu oldboy]# cat /oldboy/info.log oldboy [root@oldboyedu oldboy]# cho oldboy >/oldboy/info.log 2>&1 [root@oldboyedu oldboy]# cat /oldboy/info.log -bash: cho: command not found
tr命令: 注意:不修改原文件
- 把输入的数据当中的字符,凡是在SET1定义范围内出现的,通通对位转换为SET2出现的字符
用法1
- tr SET1 SET2 < /PATH/FROM/SOMEFILE
用法2
- tr -d SET1 < /PATH/FROM/SOMEFILE
管道:
- 连接程序,实现将前一个命令的输出直接定向后一个程序当作输入数据流
练习1:把/etc/passwd文件的前6行的信息转换为大写字符后输出
head -n 6 /etc/passwd | tr 'a-z' 'A-Z'
<< 的用法
设置以什么开始和结束(获取用户输入)
tee:
tee命令用于读取标准输入的数据,并将其内容输出成文件,tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件
COMMAND | tee /PATH/TO/SOMEFILE
特殊设备:/dev/null (可以把一些指令内容输出到这个设备中,不会保存内容,可以获取命令执行的结果)