find命令处理之exec与xargs区别

对符合条件的文件执行所给的Linux 命令,而不询问用户是否需要执行该命令。{}表示命令的参数即为所找到的文件,以;表示comman命令的结束。\是转义符,因为分号在命令中还有它用途,所以就用一个\来限定表示这是一个分号而不是表示其它意思。

-ok: 和-exec的作用相同,格式也一样,只不过以一种更为安全的模式来执行该参数所给出的shell给出的这个命令之前,都会给出提示,让用户来确定是否执行。

xargs 要结合管道来完成

格式:find [option] express |xargs command

我们看看exec和xargs都是如何传参数的。首先看看exec:

[root@localhost ~]# ls
index.skin1 skin1
[root@localhost ~]# find -type f -exec echo file {} \;
file ./skin1
file ./index.skin1

很明显,exec是对每个找到的文件执行一次命令,除非这单个的文件名超过了几k,否则不会出现命令行超长出错的问题。

我们再看看xargs:

[root@localhost ~]# ls
index.skin1 skin1
[root@localhost ~]# find -type f | xargs echo
./skin1 ./index.skin1

这 里大家看到,xargs是把所有找到的文件名一股脑的转给命令。当文件很多时,这些文件名组合成的命令行参数很容易超长,导致命令出错。同时,这也是 find | xargs 这种组合在处理有空格字符的文件名时之所以出错的原因:这时执行的命令已经不知道这些空格那些是分割符、那些是文件名中所包含的!而用exec则不会有这 两个问题。下面是一个演示:

[root@localhost ~]# mkdir TEST
[root@localhost ~]# cd TEST
/home/xyb/TEST
[root@localhost ~]# touch "file a"
[root@localhost ~]# touch "file b"
[root@localhost ~]# ls
file a file b
[root@localhost ~]# find -type f | xargs rm
rm: 无法删除‘./file’: 没有那个文件或目录
rm: 无法删除‘a’: 没有那个文件或目录
rm: 无法删除‘./file’: 没有那个文件或目录
rm: 无法删除‘b’: 没有那个文件或目录
123$ ls
file a file b
[root@localhost ~]# find -type f -exec rm {} \;
[root@localhost ~]# ls
[root@localhost ~]#

从 这里可以看出exec的缺点是每处理一个文件/目录,都要启动一次命令,效率不好; 格式麻烦,必须用 {} 做文件的代位符,必须用 \; 作为命令的结束符,书写不便。而xargs不能操作文件名有空格的文件。所以如果要使用的命令支持一次处理多个文件,并且也知道这些文件里没有带空格的、 文件数目也不大,那么使用 xargs比较方便; 否则,就要用 exec了。

原文地址:https://www.cnblogs.com/xue0123/p/10619457.html

时间: 2024-10-01 03:06:47

find命令处理之exec与xargs区别的相关文章

Linux命令find及exec、xargs的使用

由于f i n d具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下.即使系统中含有网络文件系统( N F S ),f i n d命令在该文件系统中同样有效,只要你具有相应的权限. F i n d命令的一般形式为:find pathname -options [-print -exec -ok] 该命令的参数:pathname:  find命令所查找的目录路径.例如用.来表示当前目录,用/来表示系统根目录.-print:find命令将匹配的文件输出到标准输出.-exec

exec与xargs区别

没有哪个更好哪个更不好 复习一下 exec是对每个找到的文件执行一次命令,除非这单个的文件名超过了几k,否则不会出现命令行超长出报错的问题. 而xargs是把所有找到的文件名一股脑的转给命令.当文件很多时,这些文件名组合成的命令行参数很容易超长,导致命令出错. find | xargs 这种组合在处理有空格字符的文件名时也会出错,因为这时执行的命令已经不知道哪些是分割符.哪些是文件名中的空格! 而用exec则不会有这个问题. $touch test/'test zzh' $find test/

-exec和xargs的区别

-exec和xargs的区别 2010-11-27 星期六 晴朗 当你在命令行执行: $find . -name 'core' -type f -exec rm {} /; 时,find -exec 命令会对每个匹配的文件执行一个单独的rm操作(execute a separate rm for each one), 正如你手动敲入下面命令: rm ./bin/core rm ./source/shopping_cart/core rm ./backups/core ... 但是使用这种方式,如

Linux常用命令(二十) - find之xargs

在使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行.但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误.错误信息通常是"参数列太长"或"参数列溢出".这就是xargs命令的用处所在,特别是与find命令一起使用. find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样.这样它可以先处理最先获取的一

Linux系统服务管理 ntsysv,日志, exec,xargs , screen ,curl,

                linux系统服务管理 1. Linux系统服务管理 工具ntsysv 类似图形界面管理工具,如果没有该命令使用安装 安装:yum install -y ntsysv  常用服务:crond, iptables, network, sshd, syslog, irqbalance, sendmail, microcode_ctl chkconfig --list:列出所的服务以及在每个级别是否开启 chkconfig --add/del servicename 关

xargs标准输出作为参数 给命令 echo file{1..10}| xargs touch

xargs标准输出作为参数 给命令 echo file{1..10}| xargs touch file1 ...file10 作为文件名 被xargs 一个一个传给 touch echo {1..10} |xargs -n 2 echo 配置 1 2 之后就换行 [07:29:04 [email protected] /]$echo {1..10} | xargs -n 2 echo 1 23 45 67 89 10 [07:30:11 [email protected] /]$echo {1

【转】free命令、buffer与cache的区别

freefree 命令相对于top 提供了更简洁的查看系统内存使用情况: # free total used free shared buffers cached Mem: 255988 231704 24284 0 6432 139292 -/+ buffers/cache: 85980 170008 Swap: 746980 0 746980 Mem:表示物理内存统计 -/+ buffers/cached:表示物理内存的缓存统计 Swap:表示硬盘上交换分区的使用情况,这里我们不去关心.系统

volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域

 1.volatile:要求参数修改每次都从内存中的读取.这种情况要比普通运行的变量需要的时间长. #include <stdio.h> #include <stdlib.h> #include <time.h> void main() { time_t start, end; double res = 0; time(&start);  //获取时间,传递给start //volatile强制每次从内存读取 volatile int i; for (i =

linux free命令中buffer与cache的区别

linux free命令中buffer与cache的区别 ~$ free total             used           free     shared   buffers     cached Mem:       1025204     981636      43568          0      38244     387808 -/+ buffers/cache:       555584      469620 Swap:      1931256    162