exec:

find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了。

exec解释:

-exec  参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。

{}   花括号代表前面find查找出来的文件名。

使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的。在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。 exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。

实例1:ls -l命令放在find命令的-exec选项中

命令:

find . -type f -exec ls -l {} \;

输出:

[root@localhost test]# find . -type f -exec ls -l {} \;
-rw-r--r-- root root - : ./log2014.log
-rw-r--r-- root root - : ./test4/log3-.log
-rw-r--r-- root root - : ./test4/log3-.log
-rw-r--r-- root root - : ./test4/log3-.log
-rw-r--r-- root root - : ./log2013.log
-rw-r--r-- root root - : ./log2012.log
-rw-r--r-- root root - : ./log.log
-rw-r--r-- root root - : ./log.txt
-rw-r--r-- root root - : ./test3/log3-.log
-rw-r--r-- root root - : ./test3/log3-.log
-rw-r--r-- root root - : ./test3/log3-.log
[root@localhost test]#

说明:

上面的例子中,find命令匹配到了当前目录下的所有普通文件,并在-exec选项中使用ls -l命令将它们列出。

实例2:在目录中查找更改时间在n日以前的文件并删除它们

命令:

find . -type f -mtime +14 -exec rm {} \;

输出:

[root@localhost test]# ll
总计
-rw-r--r-- root root - : log2012.log
-rw-r--r-- root root - : log2013.log
-rw-r--r-- root root - : log2014.log
lrwxrwxrwx root root - : log_link.log -> log.log
-rw-r--r-- root root - : log.log
-rw-r--r-- root root - : log.txt
drwxr-xr-x root root - : scf
drwxrwxrwx root root - : test3
drwxrwxrwx root root - : test4
[root@localhost test]# find . -type f -mtime + -exec rm {} \;
[root@localhost test]# ll
总计
-rw-r--r-- root root - : log2012.log
lrwxrwxrwx root root - : log_link.log -> log.log
drwxr-xr-x root root - : scf
drwxrwxrwx root root - : test3
drwxrwxrwx root root - : test4
[root@localhost test]#

说明:

在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!当使用诸如mv或rm命令时,可以使用-exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。

实例3:在目录中查找更改时间在n日以前的文件并删除它们,在删除之前先给出提示

命令:

find . -name "*.log" -mtime +5 -ok rm {} \;

输出:

[root@localhost test]# ll
总计
-rw-r--r-- root root - : log2012.log
lrwxrwxrwx root root - : log_link.log -> log.log
drwxr-xr-x root root - : scf
drwxrwxrwx root root - : test3
drwxrwxrwx root root - : test4
[root@localhost test]# find . -name "*.log" -mtime + -ok rm {} \;
< rm ... ./log_link.log > ? y
< rm ... ./log2012.log > ? n
[root@localhost test]# ll
总计
-rw-r--r-- root root - : log2012.log
drwxr-xr-x root root - : scf
drwxrwxrwx root root - : test3
drwxrwxrwx root root - : test4
[root@localhost test]#

说明:

在上面的例子中, find命令在当前目录中查找所有文件名以.log结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。 按y键删除文件,按n键不删除。

实例4:-exec中使用grep命令

命令:

find /etc -name "passwd*" -exec grep "root" {} \;

输出:

[root@localhost test]# find /etc -name "passwd*" -exec grep "root" {} \;
root:x:::root:/root:/bin/bash
root:x:::root:/root:/bin/bash
[root@localhost test]#

说明:

任何形式的命令都可以在-exec选项中使用。  在上面的例子中我们使用grep命令。find命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个root用户。

实例5:查找文件移动到指定目录

命令:

find . -name "*.log" -exec mv {} .. \;

输出:

[root@localhost test]# ll
总计 12drwxr-xr-x root root - : scf
drwxrwxr-x root root - : test3
drwxrwxr-x root root - : test4
[root@localhost test]# cd test3/
[root@localhost test3]# ll
总计
-rw-r--r-- root root - : log2012.log
-rw-r--r-- root root - : log2013.log
-rw-r--r-- root root - : log2014.log
[root@localhost test3]# find . -name "*.log" -exec mv {} .. \;
[root@localhost test3]# ll
总计 [root@localhost test3]# cd ..
[root@localhost test]# ll
总计
-rw-r--r-- root root - : log2012.log
-rw-r--r-- root root - : log2013.log
-rw-r--r-- root root - : log2014.log
drwxr-xr-x root root - : scf
drwxrwxr-x root root - : test3
drwxrwxr-x root root - : test4
[root@localhost test]#

实例6:用exec选项执行cp命令

命令:

find . -name "*.log" -exec cp {} test3 \;

输出:

[root@localhost test3]# ll
总计 [root@localhost test3]# cd ..
[root@localhost test]# ll
总计
-rw-r--r-- root root - : log2012.log
-rw-r--r-- root root - : log2013.log
-rw-r--r-- root root - : log2014.log
drwxr-xr-x root root - : scf
drwxrwxr-x root root - : test3
drwxrwxr-x root root - : test4
[root@localhost test]# find . -name "*.log" -exec cp {} test3 \;
cp: “./test3/log2014.log” 及 “test3/log2014.log” 为同一文件
cp: “./test3/log2013.log” 及 “test3/log2013.log” 为同一文件
cp: “./test3/log2012.log” 及 “test3/log2012.log” 为同一文件
[root@localhost test]# cd test3
[root@localhost test3]# ll
总计
-rw-r--r-- root root - : log2012.log
-rw-r--r-- root root - : log2013.log
-rw-r--r-- root root - : log2014.log
[root@localhost test3]#

xargs:

在使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。

find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高; 而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

使用实例:

实例1: 查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件

命令:

find . -type f -print | xargs file

输出:

[root@localhost test]# ll
总计
-rw-r--r-- root root - : log2012.log
-rw-r--r-- root root - : log2013.log
-rw-r--r-- root root - : log2014.log
drwxr-xr-x root root - : scf
drwxrwxrwx root root - : test3
drwxrwxrwx root root - : test4
[root@localhost test]# find . -type f -print | xargs file
./log2014.log: empty
./log2013.log: empty
./log2012.log: ASCII text
[root@localhost test]#

实例2:在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中

命令:

find / -name "core" -print | xargs echo "" >/tmp/core.log

输出:

[root@localhost test]# find / -name "core" -print | xargs echo "" >/tmp/core.log
[root@localhost test]# cd /tmp
[root@localhost tmp]# ll
总计
-rw-r--r-- root root - : core.log
drwx------ root root - : ssh-TzcZDx1766
drwx------ root root - : ssh-ykiRPk1815
drwx------ root root - : vmware-root

实例3:在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限

命令:

find . -perm -7 -print | xargs chmod o-w

输出:

[root@localhost test]# ll
总计
-rw-r--r-- root root - : log2012.log
-rw-r--r-- root root - : log2013.log
-rw-r--r-- root root - : log2014.log
drwxr-xr-x root root - : scf
drwxrwxrwx root root - : test3
drwxrwxrwx root root - : test4
[root@localhost test]# find . -perm - -print | xargs chmod o-w
[root@localhost test]# ll
总计
-rw-r--r-- root root - : log2012.log
-rw-r--r-- root root - : log2013.log
-rw-r--r-- root root - : log2014.log
drwxr-xr-x root root - : scf
drwxrwxr-x root root - : test3
drwxrwxr-x root root - : test4
[root@localhost test]#

说明:

执行命令后,文件夹scf、test3和test4的权限都发生改变

实例4:用grep命令在所有的普通文件中搜索hostname这个词

命令:

find . -type f -print | xargs grep "hostname"

输出:

[root@localhost test]# find . -type f -print | xargs grep "hostname"
./log2013.log:hostnamebaidu=baidu.com
./log2013.log:hostnamesina=sina.com
./log2013.log:hostnames=true[root@localhost test]#

实例5:用grep命令在当前目录下的所有普通文件中搜索hostnames这个词

命令:

find . -name \* -type f -print | xargs grep "hostnames"

输出:

[root@peida test]# find . -name \* -type f -print | xargs grep "hostnames"
./log2013.log:hostnamesina=sina.com
./log2013.log:hostnames=true[root@localhost test]#

实例5:用grep命令在当前目录下的所有普通文件中搜索hostnames这个词

命令:

find . -name \* -type f -print | xargs grep "hostnames"

输出:

[root@peida test]# find . -name \* -type f -print | xargs grep "hostnames"
./log2013.log:hostnamesina=sina.com
./log2013.log:hostnames=true[root@localhost test]#

说明:

注意,在上面的例子中, \用来取消find命令中的*在shell中的特殊含义。

实例6:使用xargs执行mv

命令:

find . -name "*.log" | xargs -i mv {} test4

输出:

[root@localhost test]# ll
总计
-rw-r--r-- root root - : log2012.log
-rw-r--r-- root root - : log2013.log
-rw-r--r-- root root - : log2014.log
drwxr-xr-x root root - : scf
drwxrwxr-x root root - : test3
drwxrwxr-x root root - : test4
[root@localhost test]# cd test4/
[root@localhost test4]# ll
总计 [root@localhost test4]# cd ..
[root@localhost test]# find . -name "*.log" | xargs -i mv {} test4
[root@localhost test]# ll
总计 12drwxr-xr-x root root - : scf
drwxrwxr-x root root - : test3
drwxrwxr-x root root - : test4
[root@localhost test]# cd test4/
[root@localhost test4]# ll
总计
-rw-r--r-- root root - : log2012.log
-rw-r--r-- root root - : log2013.log
-rw-r--r-- root root - : log2014.log
[root@localhost test4]#

实例7:find后执行xargs提示xargs: argument line too long解决方法:

命令:

find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f

输出:

[root@pd test4]#  find . -type f -atime + -print0 | xargs - -l1 -t rm -f
rm -f
[root@pdtest4]#

说明:

-l1是一次处理一个;-t是处理之前打印出命令

实例8:使用-i参数默认的前面输出用{}代替,-I参数可以指定其他代替字符,如例子中的[]

命令:

输出:

[root@localhost test]# ll
总计 12drwxr-xr-x root root - : scf
drwxrwxr-x root root - : test3
drwxrwxr-x root root - : test4
[root@localhost test]# cd test4
[root@localhost test4]# find . -name "file" | xargs -I [] cp [] ..
[root@localhost test4]# ll
总计
-rw-r--r-- root root - : log2012.log
-rw-r--r-- root root - : log2013.log
-rw-r--r-- root root - : log2014.log
[root@localhost test4]# cd ..
[root@localhost test]# ll
总计
-rw-r--r-- root root - : log2012.log
-rw-r--r-- root root - : log2013.log
-rw-r--r-- root root - : log2014.log
drwxr-xr-x root root - : scf
drwxrwxr-x root root - : test3
drwxrwxr-x root root - : test4
[root@localhost test]#

说明:

使用-i参数默认的前面输出用{}代替,-I参数可以指定其他代替字符,如例子中的[]

实例9:xargs的-p参数的使用

命令:

find . -name "*.log" | xargs -p -i mv {} ..

输出:

[root@localhost test3]# ll
总计
-rw-r--r-- root root - : log2015.log
[root@localhost test3]# cd ..
[root@localhost test]# ll
总计
-rw-r--r-- root root - : log2012.log
-rw-r--r-- root root - : log2013.log
-rw-r--r-- root root - : log2014.log
drwxr-xr-x root root - : scf
drwxrwxr-x root root - : test3
drwxrwxr-x root root - : test4
[root@localhost test]# cd test3
[root@localhost test3]# find . -name "*.log" | xargs -p -i mv {} ..
mv ./log2015.log .. ?...y
[root@localhost test3]# ll
总计 [root@localhost test3]# cd ..
[root@localhost test]# ll
总计
-rw-r--r-- root root - : log2012.log
-rw-r--r-- root root - : log2013.log
-rw-r--r-- root root - : log2014.log
-rw-r--r-- root root - : log2015.log
drwxr-xr-x root root - : scf
drwxrwxr-x root root - : test3
drwxrwxr-x root root - : test4
[root@localhost test]#

说明:

-p参数会提示让你确认是否执行后面的命令,y执行,n不执行。

转自:

http://www.cnblogs.com/peida/archive/2012/11/15/2770888.html

http://man.linuxde.net/xargs

find命令之exec和xargs的更多相关文章

  1. find命令应用exec及xargs

    find最普通的用法是查找文件,然后要对文件进行处理就需要用到参数-exec. 先看下manpage中介绍: -exec command ; Execute command; status is re ...

  2. 关于 ‘--exec’ 参数( find 命令)及介绍 ‘xargs ’命令区别(新版)

    前言: find 命令一直都是系统管理员的常用命令之一, 其参数中 "-exec" 尤其实用.而 "xargs" 命令,针对查询也有属于自己的见解.本文着重讲解 ...

  3. linux中exec和xargs命令的区别和优劣分析

    find的exec及ok命令 exec命令的格式为: exec command {} \; exec后面跟着的是操作命令,然后跟着{}表示每一个参数,然后空格,然后"\;".{}之 ...

  4. exec与xargs区别

    区别描述: 两者都是对符合条件的文件执行所给的Linux 命令,而不询问用户是否需要执行该命令. -exec:{}表示命令的参数即为所找到的文件,以:表示comman命令的结束.\是转义符,因为分号在 ...

  5. 每天一个 Linux 命令(20):find命令之exec

    find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了. exec解释: -exec  参数后面跟的是command ...

  6. 每天一个linux命令(20):find命令之exec

    find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了. exec解释: -exec  参数后面跟的是command ...

  7. find命令之exec

    find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了. exec解释: -exec  参数后面跟的是command ...

  8. linux find命令之exec

    find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了. exec解释: -exec  参数后面跟的是command ...

  9. PHP执行系统外部命令函数:exec()、passthru()、system()、shell_exec()

    php提供4种方法执行系统外部命令:exec().passthru().system(). shell_exec().在开始介绍前,先检查下php配置文件php.ini中是有禁止这是个函数.找到 di ...

随机推荐

  1. 如何监控执行的SQL语句?

    环境: SQL Server 2012. 打开SQL Server Profiler. 在菜单中选择New Trace, 连接上SQL Server. 在弹出的窗口中选择Event selection ...

  2. Linux随笔(安装ftp,安装jdk,安装 tomcat,安装redis,安装MySQL,安装svn)

    su: authentication failure 解决办法:sudo passwd root  更改密码即可 确认虚拟机用到的联网方式是桥接模式,不然Windows是ping不通Linux的,确保 ...

  3. 【python】如何去掉使用BeautifulSoup读取html出现的警告UserWarning: You provided Unicode markup but also provided a value for from_encoding

    如果我们这样读取html页面 soup= BeautifulSoup(rsp.text,'html.parser',from_encoding='utf-8')  # 粗体部分多余了 就会出现下面的警 ...

  4. Discuz常见小问题-如何修改网站标题title

    在全局-SEO设置中,找到论坛的title修改即可

  5. 从零开始学JavaScript一(简介)

    概要:JavaScript的组成. 各个组成部分的作用 .   一.JavaScript是一种专为与网页交互而设计的脚本语言,它的的组成  Javascript  ECMAScript(核心) DOM ...

  6. 常见的前端UI框架

    Bootstrap 首先说 Bootstrap,估计你也猜到会先说或者一定会有这个( 呵呵了 ),这是说明它的强大之处,拥有框架一壁江山的势气.自己刚入道的时候本着代码任何一个字母都得自己敲出来挡我者 ...

  7. MariaDB初始化和启动故障

    初始化故障排查 1. so依赖缺失 比如报这样的错误: ./bin/mysqld: error while loading shared libraries: libnuma.so.1: cannot ...

  8. Android4.0-4.4 加入实体按键振动支持的方法(java + smali版本号)

    有些手机比方泛泰A820L, 泛泰A890 A900 以及Nubia Z5S 和Z5S mini具有实体按键(这里所说的实体按键是相对于虚拟按键而言, 包括物理按键和触摸屏上多出来的触摸实体按键), ...

  9. SettingsEclipse

      迁移时间--2017年5月20日08:45:07 CreateTime--2016年11月15日11:07:44Author:Marydon --------------------------- ...

  10. windows下编辑的shell复制到linux无法执行

    是因为格式不对 可用vim编辑器转换格式 在vim中执行命令: set ff=unix 设置打开方式为unix