返回顶部

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 (可以把一些指令内容输出到这个设备中,不会保存内容,可以获取命令执行的结果)

 

 

posted @ 2019-09-24 23:37  Crazymagic  阅读(679)  评论(0编辑  收藏  举报