find之exec和args
本来以为以前的差不多够用了。呵呵,看到很多高手用高技巧,心痒痒的觉得我自己还可以提升啊。。哈哈哈。
这个实践起来之后,,SED,AWK也得深化一下,,,SHELL和PYTHON,作运维的两样都不能废。。。
~~~~~~~~~~~~~~~~~~~~~
find . -name "*.txt" -exec rm {} \;
find . -name "*.txt" | xargs rm {}
-exec
1.参数是一个一个传递的,传递一个参数执行一次rm
2.文件名有空格等特殊字符也能处理
-xargs
1.一次将参数传给命令,可以使用-n控制参数个数
2.处理特殊文件名需要采用如下方式:
find . -name "*.txt" print0 |xargs -0 rm {}
~~~~~~~~~~~~~~~
相比之下,也不难看出各自的缺点 1、exec 每处理一个文件或者目录,它都需要启动一次命令,效率不好; 2、exec 格式麻烦,必须用 {} 做文件的代位符,必须用 \; 作为命令的结束符,书写不便。 3、xargs 不能操作文件名有空格的文件; 综上,如果要使用的命令支持一次处理多个文件,并且也知道这些文件里没有带空格的文件,那么使用 xargs比较方便; 否则,就要用 exec了。 ~~~~~~~~~~~~~~~~~~~~ 一般有2中写法:
#find ... -exec rm {} \;
#find ... | xargs rm -rf
两者都可以把find命令查找到的结果删除,其区别简单的说是前者是把find发现的结果一次性传给exec选项,后者xargs命令会分批次的处理结果。
xargs优点:由于是批处理的,所以执行效率比较高(通过缓冲方式)
xargs缺点:有可能由于参数数量过多(成千上万),导致后面的命令执行失败
若换成 find ....-execrm {} \; 的话,
因为rm 是"逐个" item 去处理的, 则无此忧虑
rm不接受标准输入,所以不能用find / -name "tmpfile" |rm
-exec 必须由一个 ; 结束,而因为通常 shell 都会对 ; 进行处理,所以用 \; 防止这种情况。
{} 可能需要写做 '{}',也是为了避免被 shell 过滤。
例子:
cd /home/useway/DataBackup
find ./ -type f -mtime +30 -exec rm -fr {} \; > /dev/null 2>&1
./表示从当前目录找
-type f,表示只找file,文件类型的,目录和其他字节啥的不要
-mtime +30 表示30天前的文件。
-exec 把find到的文件名作为参数传递给后面的命令行,代替{}的部分
-exec后便跟的命令行,必须用“ \;”结束
/dev/null 2>&1 这样的写法.这条命令的意思是将标准输出和错误输出全部重定向到/dev/null中,也就是将产生的所有信息丢弃. ~~~~~~~~~~~~~~~~~~~~~~~~
一、find 命令格式
1、find命令的一般形式为;
2、find命令的参数;
3、find命令选项
另外,下面三个的区别:
-amin n 查找系统中最后N分钟访问的文件-atime n 查找系统中最后n*24小时访问的文件-cmin n 查找系统中最后N分钟被改变文件状态的文件-ctime n 查找系统中最后n*24小时被改变文件状态的文件-mmin n 查找系统中最后N分钟被改变文件数据的文件-mtime n 查找系统中最后n*24小时被改变文件数据的文件
4、使用exec或ok来执行shell命令
使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的
在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。
exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。
转载于:https://www.cnblogs.com/aguncn/p/4133924.html
总结
以上是生活随笔为你收集整理的find之exec和args的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 【随笔】Win7下GVIM的安装与配置
- 下一篇: 微信公众号教程(13)公司通讯录开发 上