1.4. xargs

1.4.1. 功能

从标准输入执行命令

1.4.2. 常用选项:

-a file 从指定文件读取数据作为标准输入
-0 处理包含空格的文件名,print0
-d delimiter 分隔符,默认是空格分隔显示
-i 标准输入的结果以{}代替
-I 标准输入的结果以指定的名字代替
-t 显示执行命令
-p 交互式提示是否执行命令
-n 最大命令行参数
--show-limits 查看系统命令行长度限制

1.4.3. 示例:

删除/tmp 下名字是 core 的文件:
# find /tmp -name core -type f -print | xargs /bin/rm -f
# find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
列转行(去除换行符 ):
# cut -d: -f1 < /etc/passwd | sort | xargs echo
行转列:
# echo "1 2 3 4 5" |xargs -n1
最长两列显示:
# echo "1 2 3 4 5" |xargs -n2
创建未来十天时间:
# seq 1 10 |xargs -i date -d "{} days " +%Y-%m-%d
复制多个目录:
# echo dir1 dir2 |xargs -n1 cp a.txt
清空所有日志:
# find ./ -name "*.log" |xargs -i tee {} # echo ""> {} 这样不行,>把命令中断了
rm 在删除大量的文件时,会提示参数过长,那么可以使用 xargs 删除:
# ls |xargs rm –rf
或分配删除 rm [a-n]* -rf # getconf ARG_MAX 获取系统最大参数限制


#根据记忆文件的内容,去查找文件名称
find . -type f | xargs grep "www.abiquo.com"


# 将多行输入转换成单行输出
$ cat example.txt
aaa
aaa
bbb
bbb
bbb
cccc

$ cat example.txt | xargs
aaa aaa bbb bbb bbb cccc

#  将单行输入转换成多行输出
$ cat example.txt
aaa
aaa
bbb
bbb
bbb
cccc

$ cat example.txt |xargs -n 3
aaa aaa bbb
bbb bbb cccc

# 可以定义一个用来分隔参数的分隔符。 -d 选项可以为输入数据指定自定义的分隔符:
[root@k8s-node1 centos]# cat /etc/passwd | xargs -d :
root x 0 0 root /root /bin/bash
bin x 1 1 bin /bin /sbin/nologin

# -n 将输入分割成多行,每行包含两个单词
[root@k8s-node1 centos]# cat /etc/passwd | xargs -d : -n 2
root x
0 0

# 我们需要多次执行指定的命令,每次执行时传入一个参数
cat args.txt | xargs -n 1 ./cecho.sh

# 下列命令会查找并删除所有的.txt文件:
$ find . -type f -name "*.txt" -print0 | xargs -0 rm -f

# find 来递归计算校验和:
$ find directory_path -type f –print0 | xargs -0 md5sum >> directory.md5

1.4.4. xargs用法

xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理。通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从文件的输出中读取数据。xargs的默认命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。

xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令,下面是一些如何有效使用xargs 的实用例子。

  1. 当你尝试用rm 删除太多的文件,你可能得到一个错误信息:/bin/rm Argument list too long. 用xargs 去避免这个问题

find ~ -name '*.log' -print0 | xargs -0 rm -f
  1. 获得/etc/ 下所有*.conf 结尾的文件列表,有几种不同的方法能得到相同的结果,下面的例子仅仅是示范怎么实用xargs ,在这个例子中实用 xargs将find 命令的输出传递给ls -l

# find /etc -name "*.conf" | xargs ls –l
  1. 假如你有一个文件包含了很多你希望下载的URL, 你能够使用xargs 下载所有链接

# cat url-list.txt | xargs wget –c
  1. 查找所有的jpg 文件,并且压缩它

# find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz
  1. 拷贝所有的图片文件到一个外部的硬盘驱动

# ls *.jpg | xargs -n1 -i cp {} /external-hard-drive/directory