找到命令的处理动作以及xargs命令

  

自己的《Linux系统管理初学者指南——基于CentOS 7.6》已于2019年10月份出版,对于这本书的质量总体上感觉还算满意,但是限于当时的知识水平,有些地方描述的仍然不是很清楚,所以在讲课的过程中也在不断进行修订。比如最近在讲到找到命令的处理动作时,不少学生就提出疑问,因而我对原书中这部分内容进行了重写,希望再版时可以订正。
罢业矫畹拇矶饕约皒args命令"

  

处理动作

  

找到命令不仅可以查找,还可以对找到的结果进行进一步的处理,这就要用到“处理动作”。
例如,找出/usr/bin目录中所有的符号链接文件。
<代码> [root@localhost ~] #找到工作类型l
上面这条命令查找出来的结果只显示文件名,如果我们还想查看每个符号链接文件都指向了哪个源文件,就可以在找到命令的最后加上处理动作“- ls”。

  
 <代码> [root@localhost ~] #找到工作类型l - ls
  50346791 0 lrwxrwxrwx 1根根3 2019年2月14日/usr/bin/captoinfo→抽搐 
  

需要注意的是,这个处理动作“- ls”属于是找到命令的一部分,而并非是之前所介绍的ls命令,因而无法在处理动作“- ls”之后加上ls命令的各种选项,例如,我们希望找出/etc目录中所有大小在1 mb以上的文件,并人性化显示其详细信息,那么执行下面的命令就会报错。

  
 <代码> [root@localhost ~] #发现/etc + 1 m - ls lh
  发现:未知的断言“韩” 
  

要实现这个需求,就要借助于发现命令的另外一个处理动作“-”。这个处理动作可以将找到命令找到的结果当作文件去处理,在“-”的后面要跟上进一步处理所要执行的命令,另外在命令中还需要使用符号“{}”表示找到命令查找到的结果,在命令的最后必须添加“\”,表示命令结束(注意前面有个空格)。
例如,找出/etc目录中所有大小在1 mb以上的文件,并人性化显示其详细信息,下面这条命令才是正确的做法。在这条命令中,ls就是之前所介绍的ls命令,我们借助于-将找到命令找到的结果,以文件的形式传给ls命令继续处理。

  
 <代码> [root@localhost ~] #发现/etc + 1 m - ls lh {} \;
  - r。1根根3.8米2018年11月3日/etc/selinux/targeted/active/policy.kern  
  

再比如,找出/tmp目录中所有后缀为”。txt”的文件并将其删除。
<代码> root@localhost ~ #发现/tmp - name”*。txt”- rm - f{} \;
很多同学在这里会疑惑,为什么这里用管道符“|”(将在2.9.5节介绍)无法实现上面的操作呢?比如我们做下面的测试:

  
 <代码> [root@localhost ~] #触摸/tmp/{a, b, c}。txt #在/tmp目录中生成3个测试文件
  root@localhost ~ #发现/tmp - name”*。txt”| rm - f #利用管道结合rm删除
  root@localhost ~ #发现/tmp - name”*。三种“#测试文件仍然存在/tmp/a.txt/tmp/b.txt/tmp/c.txt
  root@localhost ~ #发现/tmp - name”*。txt”- rm - f {} \;#利用exec结合rm删除
  root@localhost ~ #发现/tmp - name”*。三种“#测试文件被成功删除 
  

<强>处理动作-最主要的作用就是可以将找到命令找到的结果当成文件去处理,而默认情况下,找到命令找到的结果是被当作文本信息去处理的。
怎样理解上面这段话呢?比如对于执行”找到/tmp - name“* .txt"“命令所找到的三个文件:/tmp/a.txt,/tmp/b.txt,/tmp/c.txt,默认情况下找到命令只是把符合查找条件的这三个文件找的到,并把它们的名字在屏幕上输出,因而我们在屏幕上所看到的只是三行文本信息。对于文本信息,可以使用之前介绍的文件内容操作命令进行处理,比如用wc命令统计行数,用grep命令进行过滤等。

  
 <代码> root@localhost ~ #发现/tmp - name”*。txt”| wc - l #统计找到找到的文件数量
  3.
  root@localhost ~ #发现/tmp - name”*。txt”| grep ' a ' #对发现的结果进行过滤/tmp/a.txt  
  

对于文本信息,之前介绍的文件和目录操作命令就无法处理了,比如cp, mv, rm等,因为这些命令所操作的对象必须是文件。此时-就可以派上用场,因为它的主要作用就是可以将找到命令找到的结果不再看作是文本信息,而是看作文件。因而如果需要对发现的结果用文件操作命令进行进一步处理的话,那么就需要结合- exec。
例如,查找/boot目录下的以“init”开头的文件,并将其复制到/tmp目录。
<代码> [root@localhost ~] #发现/boot - name“init *”- cp {}/tmp \;

找到命令的处理动作以及xargs命令