简介

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.backup
mv b.js b.js.backup
mv 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.js
ls -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 directory
ls: cannot access 01.css: No such file or directory
ls: cannot access ./hello: No such file or directory
ls: 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://craftsmanbai.gitbooks.io/linux-learning-wiki/content/xargs.html

http://wiki.jikexueyuan.com/project/shell-learning/xargs.html

Linux基础:xargs命令的更多相关文章

  1. Linux学习笔记(9)linux网络管理与配置之一——Linux基础网络命令与学习大纲(0)

    大纲目录 0.常用linux基础网络命令 1.配置主机名 2.配置网卡信息与IP地址 3.配置DNS客户端 4.配置名称解析顺序 5.配置路由与默认网关 6.双网卡绑定 [1] ping [2]net ...

  2. linux下xargs命令用法详解 【转】

    转自:http://blog.chinaunix.net/uid-128922-id-289992.html xargs在linux中是个很有用的命令,它经常和其他命令组合起来使用,非常的灵活. xa ...

  3. linux下xargs命令用法详解

    原文:http://blog.chinaunix.net/uid-128922-id-289992.html xargs在linux中是个很有用的命令,它经常和其他命令组合起来使用,非常的灵活. xa ...

  4. 转 linux下xargs命令用法详解

    xargs在linux中是个很有用的命令,它经常和其他命令组合起来使用,非常的灵活. xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤 ...

  5. Linux下xargs命令详解及xargs与管道的区别

    在工作中经常会接触到xargs命令,特别是在别人写的脚本里面也经常会遇到,但是却很容易与管道搞混淆,本篇会详细讲解到底什么是xargs命令,为什么要用xargs命令以及与管道的区别.为什么要用xarg ...

  6. Linux基础常用命令大全学习

    1.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录.文件夹.文件权限)查看目录信息等等 常用参数搭配: ls -a 列出目录所有文 ...

  7. Linux基础入门级命令文档

    Linux系统上命令的使用格式,及常用命令示例 1.命令提示符 登录系统后,第一眼看到的内容是: [root@node01 ~]# 上图就是 Linux 系统的命令提示符.那么,这个提示符的含义是什么 ...

  8. 【转】【Linux】linux下xargs命令

    xargs命令xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具.它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者stdin并将其转换成特定命令的命令参数.xa ...

  9. Linux中 xargs 命令用法

    xargs命令: xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具. 1.它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者stdin并将其转换成特定命令的命令 ...

  10. Linux 下 xargs 命令

    xargs 常常被大家忽略的一个命令,对它的一些用法很多人可能不熟悉,其实它是一个功能强大的命令,特别是在结合管道进行批量处理方面 语法 xargs 语法格式如下 xargs [OPTION]... ...

随机推荐

  1. centos6.7系统安装流程

    虚拟机创建centos的过程,如下: 1.首先创建一个空白文件 2.打开虚拟机,打开文件,或者页面的<创建虚拟机>,如下: 3.打开之后如下所示,选择自定义,Linux崇尚自由 4.第四步 ...

  2. 初识React-Redux之粗暴理解入门

    权当暂记 日后再行补充完善,若有阅读者,请翻到下文黄色标题'从这里开始'起阅读. Rudex在我看来最本质做的事情就是将所有的State属性统一存储(一个属性就是一个注册到store的Reducer) ...

  3. 在ASP.NET Core Web API中为RESTful服务增加对HAL的支持

    HAL(Hypertext Application Language,超文本应用语言)是一种RESTful API的数据格式风格,为RESTful API的设计提供了接口规范,同时也降低了客户端与服务 ...

  4. WPF学习之路一

    前段时间一直在学习MVC,工作需要,现在需要180度急转弯,搞WPF,MVVM,只能找资料学习了. WPF中有一个消息机制,就是当前台控件绑定的值改变时,会自动通知到指定的事件来改变VM的值,反之亦然 ...

  5. [转载] java多线程学习-java.util.concurrent详解(三)ScheduledThreadPoolExecutor

    转载自http://janeky.iteye.com/blog/770441 ------------------------------------------------------------- ...

  6. Vue浅谈

    谈Vue 最近在学习Vue相关的知识点并且也做一些练手,就在学习过程中出现的各种坑爹的地方做一个总结!之后再遇到也不会抓瞎. 1.Vue工程的安装 (1)首先先安装node.js这是Vue的运行基础. ...

  7. thinphp原生异步分页

    异步分页: $sql="............";   $result=$m->query($sql);   $count =count($result);   $page ...

  8. 软件测试博客日记Day02-11.16日 —— 赵天宇 —— 禅道的使用和配置

    禅道 1. 安装 1. 进入禅道的官方下载地址:http://www.zentao.net/download/80053.html 2. 下载禅道开源版本. 3. 正常安装,注意一定要放在根目录下. ...

  9. 《java.util.concurrent 包源码阅读》18 Exchanger

    Exchanger可以看做双向数据传输的SynchronousQueue,即没有生产者和消费者之分,任意两个线程都可以交换数据. 在JDK5中Exchanger被设计成一个容量为1的容器,存放一个等待 ...

  10. You may rarely look at it. But you'll always feel it

    You may rarely look at it. But you'll always feel it