linux xargs命令详解及应用

引子:find . -name "*.csv" | xargs du -ck | grep total

  • 使用find -exec选项处理匹配到的文件时,find命令将匹配到的所有文件一起传递给exec执行

  • 有些系统exec的命令长度有限制,运行会导致溢出错误“参数列太长”或“参数列溢出”

  • exec会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行,一些情况下会导致进程过多,系统性能下降的问题,因而效率不高

  • xargs命令每次只获取一部分文件而不是全部,处理完先获取的 然后再去继续获取(究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。)

  • xargs只有一个进程,保证系统性能

使用实例:

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

find . -type f -print | xargs file

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

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

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

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

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

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

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

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

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

6.使用xargs执行mv

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

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

find . -type f -atime +0 -printf0 | xargs -0 -11 -t rm -f

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

rm -f

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

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

find . -name "file" | xargs -I [] cp [] ..

9.xargs的-p参数的使用

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

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

你可能感兴趣的:(linux xargs命令详解及应用)