天天看点

Linux命令之xargs

      xargs是一条Unix和类Unix操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。

例如删除某个目录下的文件,可以这么做 rm 

find /path -type f

, 如果文件过多,就可能出现 

参数列表过长

的错误,导致执行失败。

这个时候使用 xargs 就能比较好的解决问题 

find /path -type f -print0 | xargs -0 rm

xargs是通过标准输入或者是管道中的一段字符串来传递命令的

参数列表

, 中间会有个解析的参数的过程,然后调用相应的命令并执行,详细的参数解释请 

man xargs

用法

-0

xargs参数列表是通过空格,制表符,还有换行符来区分的,例如下面的一个命令

1      
find /tmp -name core -type f -print | xargs /bin/rm -f      

一般情况下会正常的执行,但是文件名中如果有 空格或者是换行符,就会执行失败了

1      
find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f      

这时候加上 

-0

 就能正常执行了。

-I

替换字符,把输入进来的参数替换成一个自己定义的字符,类似给输入的参数起了一个别名。

1      
find . -name '*.py' -print0 | xargs -0 -I fname echo fname python      

上面的命令会输出 

.py

 文件的名称,然后附加 “ python”,也就是 

./test.py

 变成了 

./test.py python

查看 

/

 目录下的文件

1      
echo "ls -ls -h"|xargs -I cmd sh -c cmd" /"      

–show-limits

显示当前操作系统,命令行长度的限制

1
2
3
4
5
6
7
8
9      
[[email protected] test]$ xargs --show-limits
Your environment variables take up 2161 bytes
POSIX upper limit on argument length (this system): 2617231
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 2615070
Size of command buffer we are actually using: 131072

Execution of xargs will continue now, and it will try to read its input and run commands; if this is not what you wanted to happen, please type the end-of-file keystroke.
Warning: /bin/echo will be run at least once.  If you do not want that to happen, then press the interrupt keystroke.      

例子

删除当前目录下 

.c

文件

1      
find . -name "*.c" -print0 | xargs -0 rm -rf      

查找当前目录下包含 

utf-8

的 

.py

 文件,显示行号

1      
find . -name '*.py' -print0 | xargs -0 grep -n 'utf-8'      

查找当前目录下 

.bak

 文件,并移动到 

~/old.files

 文件夹下面

1      
find . -name "*.bak" -print0 | xargs -0 -I file mv file ~/old.files      

实际使用中,复杂的操作比较少,暂且记录那么多。