简介

xargs可以将输入内容(通常通过命令行管道传递),转成后续命令的参数,通常用途有:

  1. 命令组合:尤其是一些命令不支持管道输入,比如ls
  2. 避免参数过长:xargs可以通过-nx来将参数分组,避免参数过长。

使用语法如下

Usage: xargs [OPTION]... COMMAND INITIAL-ARGS...Run COMMAND with arguments INITIAL-ARGS and more arguments read from input.复制代码

入门例子

首先,创建测试文件

touch a.js b.js c.js复制代码

接着,运行如下命令:

ls *.js | xargs ls -al复制代码

输出如下:

-rw-r--r--  1 a  wheel  0 12 18 16:18 a.js-rw-r--r--  1 a  wheel  0 12 18 16:18 b.js-rw-r--r--  1 a  wheel  0 12 18 16:18 c.js复制代码

命令解释:

  1. 首先,ls *.js的输出为a.js b.js c.js
  2. 通过管道,将a.js b.js c.js作为xargs的输入参数。
  3. xargs命令收到输入参数后,对参数进行解析,以空格/换行作为分隔符,拆分成多个参数,这里变成a.jsb.jsc.js
  4. xargs将拆分后的参数,传递给后续的命令,作为后续命令的参数,也就是说,组成这样的命令ls -al a.js b.js c.js

可以加上-t参数,在执行后面的命令前,先将命令打印出来。

ls *.js | xargs -t ls -al复制代码

输出如下,可以看到多了一行内容ls -al a.js b.js c.js,这就是实际运行的命令。

ls -al a.js b.js c.js-rw-r--r--  1 a  wheel  0 12 18 16:18 a.js-rw-r--r--  1 a  wheel  0 12 18 16:18 b.js-rw-r--r--  1 a  wheel  0 12 18 16:18 c.js复制代码

例子:参数替换

有的时候,我们需要用到原始的参数,可以通过参数-i-I实现。参数说明如下

  -I R                         same as --replace=R (R must be specified)  -i,--replace=[R]             Replace R in initial arguments with names                               read from standard input. If R is                               unspecified, assume {}复制代码

例子如下,将所有的.js结尾的文件,都加上.backup后缀。-I '{}'表示将后面命令行的{}替换成前面解析出来的参数。

ls *.js | xargs -t -I '{}' mv {} {}.backup复制代码

展开后的命令如下:

mv a.js a.js.backupmv b.js b.js.backupmv c.js c.js.backup复制代码

例子:参数分组

命令行对参数最大长度有限制,xargs通过-nx对参数进行分组来解决这个问题。

首先,创建4个文件用来做实验。

touch a.js b.js c.js d.js复制代码

然后运行如下命令:

ls *.js | xargs -t -n2 ls -al复制代码

输出如下,-n2表示,将参数以2个为一组,传给后面的命令。

ls -al a.js b.js -rw-r--r-- 1 root root 0 Dec 18 16:52 a.js-rw-r--r-- 1 root root 0 Dec 18 16:52 b.jsls -al c.js d.js -rw-r--r-- 1 root root 0 Dec 18 16:52 c.js-rw-r--r-- 1 root root 0 Dec 18 16:52 d.js复制代码

例子:特殊文件名

有的时候,文件名可能存在特殊字符,比如下面的文件名中存在空格。

touch 'hello 01.css' 'hello 02.css'复制代码

运行之前的命令会报错,因为xargs是以空格/换行作为分隔符,于是就会出现预期之外的行为。

# 命令find . -name '*.css' | xargs -t ls -al#输出ls -al ./hello 01.css ./hello 02.css # 展开后的命令ls: cannot access ./hello: No such file or directoryls: cannot access 01.css: No such file or directoryls: cannot access ./hello: No such file or directoryls: cannot access 02.css: No such file or directory复制代码

xargs是这样解决这个问题的。

  1. -print0:告诉find命令,在输出文件名之后,跟上NULL字符,而不是换行符;
  2. -0:告诉xargs,以NULL作为参数分隔符;
find . -name '*.css' -print0 | xargs -0 -t ls -al复制代码

例子:日志备份

将7天前的日志备份到特定目录

find . -mtime +7 | xargs -I '{}' mv {} /tmp/otc-svr-logs/复制代码

 

作者:程序猿小卡
链接:https://juejin.cn/post/6844903540876394509
 

©著作权归作者所有:来自51CTO博客作者wx607823dfcf6a9的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 【DB笔试面试712】在Oracle中,启动和关闭集群的命令是什么?
  2. 别小看tail 命令,它难倒了技术总监
  3. 唬人的Redis多线程,也就那么回事
  4. 【DB笔试面试710】在Oracle中,用哪个参数可以判断一个数据库是否
  5. Java如何获取方法参数具体名称?这是个好问题!
  6. RTX3080Ti和RTX2080Ti性能差距 RTX3080Ti和RTX2080Ti参数对比哪
  7. rtx3090和rtx3080ti性能差距 rtx3090和rtx3080ti 参数对比哪个
  8. rtx3080和rtx3080ti性能差距 rtx3080和rtx3080ti 参数对比哪个好
  9. 执行 brew install 命令长时间卡在 Updating Homebrew 的解决方

随机推荐

  1. Javascript 同步异步加载详解 (十足的好文
  2. java的数组下标的非常严重的问题,异常不爽
  3. eclipseIDE for Java EE 下 离线 安装CDT
  4. JAVAFX 在TableView里面使用CheckBox
  5. 单击按钮后更改Frame的内容窗格
  6. JavaScript制作网页数据图表/曲线图
  7. 关于webview中java调用js函数(解决loadUrl
  8. 已经安装了JDK,并且配置好了环境,在cmd中输
  9. Java:IntelliJ想法生成的代码错误地为所有
  10. 了解数组类型和使用java.util.Arrays类