批量处理(批量查找)的简单应用--xargs、exec、grep

xargs、exec

xargs

find ./ -name ‘*.log’ | xargs rm

文件名中有空格的处理
1. 常用find的-print0选项使用\0来分隔而不是\n分隔,再通过xargs -0来配对保证one space.log的整体性。因为-print0后one space.log的前后各有一个\0,但是文件名中间没有。

find -name “* *.log” -print0 | xargs -0 rm -rf

  1. xargs上处理,只要通过配合-i选项,就能宣告它的整体性
    如果不使用-i,则默认是将分割后处理后的结果整体传递到命令的最尾部。但是有时候需要传递到多个位置,不使用-i就不知道传递到哪个位置了,例如重命名备份的时候在每个传递过来的文件名加上后缀.bak,这需要两个参数位。
    使用xargs -i时以大括号{}作为替换符号,传递的时候看到{}就将被结果替换。可以将{}放在任意需要传递的参数位上,如果多个地方使用{}就实现了多个传递。

find ./ -name ‘*.log’ | xargs -i rm ‘{}’ (引号可以不加)

exec

find ./ -name ‘*.log’ -exec ls -l {} \;

-exec command:command 为其他指令,-exec后面可再接额外的指令来处理搜寻到的结果。

这里写图片描述
(-perm可以选择权限,-user可是选择用户,-group可以选择用户组等 )

{ }代表的是「由 find 找到的内容」,如上图所示,找到的结果会被放置到 { } 位置中;

-exec一直到 \; 是关键字,代表找到额外动作的开始(-exec)到结束(\),在这中间的就是找到指令内的额外动作;

因为「;」在bash的环境下是有特殊意义的,因此利用反斜线来跳脱。

exec && xargs

-exec
1.参数是一个一个传递的,传递一个参数执行一次rm
2.文件名有空格等特殊字符也能处理
-xargs
1.一次将参数传给命令,可以使用-n控制参数个数
2.处理特殊文件名需要采用如下方式:
find . -name “*.txt” print0 |xargs -0 rm {}

以下效果一样:(grep后均可跟-l -n等选项)

find ./ -name ‘*.log’ -exec grep ‘aaaa’ {} \;
find ./ -name ‘*.log’ -print0 | xargs -0 grep ‘aaaa’./a.log
find ./ -name ‘*.log’ | xargs -i grep ‘aaaa’ {}

grep

在当前目录搜索带’energywise’行的文件

grep ‘energywise’ *

在当前目录及其子目录下搜索’energywise’行的文件

grep -r ‘energywise’ *

在当前目录及其子目录下搜索’energywise’行的文件,但是不显示匹配的行,只显示匹配的文件

grep -l -r‘energywise’ *

指定别的文件夹

grep -n ‘one’ /home/vagrant/test_xargs/*

详细参见:
关于 ‘–exec’ 参数( find 命令)及介绍 ‘xargs ’命令区别(新版)
find -exec 与xargs 区别
xargs的原理剖析及用法详解
linux grep命令详解
管道命令和xargs的区别(经典解释)

展开阅读全文

没有更多推荐了,返回首页