每天一个Linux命令(21)find命令_xargs参数

Posted MenAngel

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每天一个Linux命令(21)find命令_xargs参数相关的知识,希望对你有一定的参考价值。

     xargs 与 exec 的作用类似,但是xargs与find 一起使用时,一般配合管道一起使用。

    前面的输出转换为后方指令的参数输入,使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。

 

    (1)用法:

    用法:  [find命令] | [xargs] [其他命令]

 

    (2)功能:

     功能: 该命令的主要功能是从输入中构建和执行shell命令。与-exec类似,将find找到的文件当作参数执行接下来的命令。

 

    (3)xargs参数的解释

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

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

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

 

    (4)实例:

      1)[[email protected] Documents]# find . -type f -print         find的输出到标准输出的参数-print

[[email protected] Documents]# find . -type f  -print    //等价于find . -type f 因为默认是输出到标准输出的,所以加不加标准输出-print一样
./less1
./less2
./head_text
./tail_text
./tempory
./newlocate
./uText
./findDir/t1.txt
./findDir/T1.txt
./findDir/T2.txt
./findDir/p1.pdf
./findDir/p2.pdf

      2)[[email protected] Documents]# find . -type f -print | xargs file        查找当前目录下的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件

[[email protected] Documents]# find . -type f -print | xargs file
./less1:          ASCII text
./less2:          ASCII text
./head_text:      ASCII text
./tail_text:      ASCII text
./tempory:        ASCII text
./newlocate:      empty
./uText:          empty
./findDir/t1.txt: empty
./findDir/T1.txt: empty
./findDir/T2.txt: empty
./findDir/p1.pdf: empty
./findDir/p2.pdf: empty

      3)[[email protected] Documents]# find . -type f | xargs ls -l        列出每个查找到的文件的详细信息,包括相对路径

[[email protected] Documents]# find . -type f | xargs ll           //为每一个找到的文件执行ll命令显然是不行的(虽然ll是“ls -l”的缩写)
xargs: ll: 没有那个文件或目录
[[email protected] Documents]# find . -type f | xargs ls -l
-rw-r--r--. 1 root root   0 5月  17 04:18 ./findDir/p1.pdf
-rw-r--r--. 1 root root   0 5月  17 04:18 ./findDir/p2.pdf
-rw-r--r--. 1 root root   0 5月  17 03:50 ./findDir/t1.txt
-rw-r--r--. 1 root root   0 5月  17 04:02 ./findDir/T1.txt
-rw-r--r--. 1 root root   0 5月  17 04:02 ./findDir/T2.txt
-rw-r--r--. 1 root root 664 5月   9 07:59 ./head_text
-rw-r--r--. 1 root root  45 5月   9 08:15 ./less1
-rw-r--r--. 1 root root  57 5月   9 08:16 ./less2
-rw-r--r--. 1 root root   0 5月  15 18:21 ./newlocate
-rw-r--r--. 1 root root 259 5月  12 21:53 ./tail_text
-rw-r--r--. 1 root root 216 5月  12 22:24 ./tempory
-rw-r--r--. 1 root root   0 5月  15 18:34 ./uText
[[email protected] Documents]# ls -l
总用量 20
drwxr-xr-x. 2 root root  71 5月  17 04:18 findDir
-rw-r--r--. 1 root root 664 5月   9 07:59 head_text
-rw-r--r--. 1 root root  45 5月   9 08:15 less1
-rw-r--r--. 1 root root  57 5月   9 08:16 less2
-rw-r--r--. 1 root root   0 5月  15 18:21 newlocate
-rw-r--r--. 1 root root 259 5月  12 21:53 tail_text
-rw-r--r--. 1 root root 216 5月  12 22:24 tempory
-rw-r--r--. 1 root root   0 5月  15 18:34 uText

      4)[[email protected] Documents]# find . -type f -print | xargs chmod a-r         回收文件的权限(r代表读,w代表写,r代表可执行)

[[email protected] Documents]# find . -type f -print | xargs chmod a-x    //回收x权限
[[email protected] Documents]# ll
总用量 20
drwxr-xr-x. 2 root root  71 5月  17 04:18 findDir
-rw-r--r--. 1 root root 664 5月   9 07:59 head_text
-rw-r--r--. 1 root root  45 5月   9 08:15 less1
-rw-r--r--. 1 root root  57 5月   9 08:16 less2
-rw-r--r--. 1 root root   0 5月  15 18:21 newlocate
-rw-r--r--. 1 root root 259 5月  12 21:53 tail_text
-rw-r--r--. 1 root root 216 5月  12 22:24 tempory
-rw-r--r--. 1 root root   0 5月  15 18:34 uText
[[email protected] Documents]# find . -type f -print | xargs chmod a-r  //回收r权限
[[email protected] Documents]# ll
总用量 20
drwxr-xr-x. 2 root root  71 5月  17 04:18 findDir
--w-------. 1 root root 664 5月   9 07:59 head_text
--w-------. 1 root root  45 5月   9 08:15 less1
--w-------. 1 root root  57 5月   9 08:16 less2
--w-------. 1 root root   0 5月  15 18:21 newlocate
--w-------. 1 root root 259 5月  12 21:53 tail_text
--w-------. 1 root root 216 5月  12 22:24 tempory
--w-------. 1 root root   0 5月  15 18:34 uText

      5)[[email protected] sunjimeng]# find ./Document -name "all.txt" -print | xargs echo "Success" >/home/sunjimeng/Documents/core.log      将找到的文件加上相对路径和自定义字符串输出到另一个文件中

[[email protected] Document]# cat all.txt
this is t1.txt!
Im testing -exec option!
this is t2.txt!
Im testing -exec optioin!
[[email protected] Document]# cd ./
[[email protected] Document]# cd ../
[[email protected] sunjimeng]# find ./Document -name "all.txt" -print | xargs echo "Success" >/home/sunjimeng/Documents/core.log
[[email protected] sunjimeng]# cat /home/sunjimeng/Documents/core.log   //可以看出上个命令将什么拷进了自定义文件中
Success ./Document/all.txt
[[email protected] sunjimeng]# find ./Document -name "all.txt"
./Document/all.txt

      6)[[email protected] sunjimeng]# find ./Document -name "all.txt" | xargs cat >/home/sunjimeng/Documents/t3.txt          将找到的文件内容拷贝到另一个文件中

[[email protected] Document]# cat all.txt
this is t1.txt!
Im testing -exec option!
this is t2.txt!
Im testing -exec optioin!
[[email protected] sunjimeng]# find ./Document -name "all.txt" | xargs cat >/home/sunjimeng/Documents/t3.txt  //(5)输出的是自定义内容,而这个命令是把找到的文件内容拷贝一份到自定义文件中
[[email protected] sunjimeng]# cat /home/sunjimeng/Documents/t3.txt
this is t1.txt!
Im testing -exec option!
this is t2.txt!
Im testing -exec optioin!

      7)[[email protected] sunjimeng]# find ./ -type f | xargs ls -l | awk ‘BEGIN{size=0}{size+=$5};END{print size}‘          统计当前目录下所有文件的大小,含子目录,精确到字节

[[email protected] sunjimeng]# find ./ -type f | xargs ls -l | awk BEGIN{size=0}{size+=$5};END{print size}
5173736

      8)[[email protected] Documents]# find . -type f -print | xargs grep "Lost"        查找find找到的文件中有没有包含"Lost"字符串的

[[email protected] Documents]# find . -type f -print | xargs grep "t3.txt" //虽然当前目录下有t3.txt,但查询的结果却为空
[[email protected] Documents]# find . -type f -print
./less1
./less2
./head_text
./tail_text
./tempory
./newlocate
./uText
./findDir/t1.txt
./findDir/T1.txt
./findDir/T2.txt
./findDir/p1.pdf
./findDir/p2.pdf
./find
./core.log
./t3.txt
[[email protected] Documents]# cat less1
Lost means Get!

No losing No getting!

End!
[[email protected] Documents]# find . -type f -print | xargs grep "Lost"       //表明它是根据文件内容进行匹配的,而不是根据查找到的文件的名字。
./less1:Lost means Get!

      9)[[email protected] findDir]# find -type f -name "t1.txt" -print |xargs -p mv t2.txt      提醒是否执行find后面的其他命令

[[email protected] findDir]# find -type f -name "t1.txt" -print |xargs -p mv t2.txt             这里用mv命令出了错误,后面解决!
mv t2.txt ./t1.txt ?...n
[[email protected] findDir]# find -type f -name "t1.txt" -print |xargs -p mv t2.txt
mv t2.txt ./t1.txt ?...y
mv: 无法获取"t2.txt" 的文件状态(stat): 没有那个文件或目录

 

以上是关于每天一个Linux命令(21)find命令_xargs参数的主要内容,如果未能解决你的问题,请参考以下文章

每天一个 Linux 命令(21):find命令之xargs

每天一个Linux命令(19)find命令_初识

常用的linux命令(自己总结)

每天一个Linux命令(19)--find命令

每天一个linux命令(19):find 命令概览

每天一个 Linux 命令(19):find 命令概览