linux shell脚本学习xargs命令使用详解

作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题

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

xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令,下面是一些如何有效使用xargs 的实用例子。
1. 当你尝试用rm 删除太多的文件,你可能得到一个错误信息:/bin/rm Argument list too long. 用xargs 去避免这个问题

?


1

find ~ -name ‘*.log‘ -print0 | xargs -0 rm -f

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

?


1

# find /etc -name "*.conf" | xargs ls –l

3. 假如你有一个文件包含了很多你希望下载的URL, 你能够使用xargs 下载所有链接

?


1

# cat url-list.txt | xargs wget –c

4. 查找所有的jpg 文件,并且压缩它

?


1

# find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz

5. 拷贝所有的图片文件到一个外部的硬盘驱动

?


1

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

EXAMPLES
find /tmp -name core -type f -print | xargs /bin/rm -f
Find files named core in or below the directory /tmp and delete them. Note that this will work incorrectly if there are any filenames containing newlines or spaces.

find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
Find files named core in or below the directory /tmp and delete them, processing filenames in such a way that file or directory names containing spaces or newlines are correctly handled.

find /tmp -depth -name core -type f -delete
Find files named core in or below the directory /tmp and delete them, but more efficiently than in the previous example (because we avoid the need to use fork(2) and exec(2) to launch rm and we don‘t need the extra xargs process).

cut -d: -f1 < /etc/passwd | sort | xargs echo
Generates a compact listing of all the users on the system.

xargs sh -c ‘emacs "[email protected]" < /dev/tty‘ emacs
Launches the minimum number of copies of Emacs needed, one after the other, to edit the files listed on xargs‘ standard input. This example achieves the same effect as BSD‘s -o option, but in a more flexible and portable way.

例如,下面的命令:

复制代码代码如下:

rm `find /path -type f`

如果path目录下文件过多就会因为“参数列表过长”而报错无法执行。但改用xargs以后,问题即获解决。

复制代码代码如下:

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

本例中xargs将find产生的长串文件列表拆散成多个子串,然后对每个子串调用rm。-print0表示输出以null分隔(-print使用换行);-0表示输入以null分隔。这样要比如下使用find命令效率高的多。

复制代码代码如下:

find /path -type f -exec rm ‘{}‘ \;

xargs命令应该紧跟在管道操作符之后,它以标准输入作为主要的源数据流,并使用stdin并通过提供命令行参数来执行其他命令,例如:

复制代码代码如下:

command | xargs

实例应用1,将多行输入转换为单行输出:

复制代码代码如下:

[email protected]:~/learn$ cat example.txt 
1 2 3 4 5
6 7
8
[email protected]:~/learn$ cat example.txt | xargs 
1 2 3 4 5 6 7 8

实例应用2,将单行输入转换为多行输出:

复制代码代码如下:

[email protected]:~/learn$ cat example.txt | xargs -n 2
1 2
3 4
5 6
7 8

空格是默认的定界符,-n 表示每行显示几个参数

还可以使用-d参数来分隔参数,如下:

复制代码代码如下:

[email protected]:~/learn$ echo "splitXhiXamosliXsplit" | xargs -d "X" -n 1
split
hi
amosli
split

实例应用3,读取stdin,将格式化参数传递给命令

复制代码代码如下:

#定义一个echo命令每次在输出参数后都加上#
[email protected]:~/learn$ cat cecho.sh 
echo $*‘#‘

#需求1:输出多个参数
[email protected]:~/learn$ sh cecho.sh arg1 
arg1#
[email protected]:~/learn$ sh cecho.sh arg2 
arg2#
[email protected]:~/learn$ sh cecho.sh arg3 
arg3#

#需求2:一次性提供所有的命令参数
[email protected]:~/learn$ sh cecho.sh arg1 arg2 arg3
arg1 arg1 arg2 arg3#

#针对需求1、2,使用xargs代替,先用vi建一个新文件args.txt,如下:
[email protected]:~/learn$ cat args.txt 
arg1
arg2
arg3
#批量输出参数:
[email protected]:~/learn$ cat args.txt | xargs -n 1
arg1
arg2
arg3
[email protected]:~/learn$ cat args.txt | xargs -n 2 sh cecho.sh
arg1 arg2#
arg3#
#一次性输出所有参数:
[email protected]:~/learn$ cat args.txt | xargs sh cecho.sh ;
arg1 arg2 arg3#

需求3,如何将参数嵌入到固定的命令行中?如下所示:

复制代码代码如下:

[email protected]:~/learn$ sh cecho.sh -p args1 -1
-p args1 -1#
[email protected]:~/learn$ sh cecho.sh -p args2 -1
-p args2 -1#
[email protected]:~/learn$ sh cecho.sh -p args3 -1
-p args3 -1#

使用xargs的解决方案:

复制代码代码如下:

[email protected]:~/learn$ cat args.txt | xargs -I {} sh cecho.sh -p {} -1
-p arg1 -1#
-p arg2 -1#
-p arg3 -1#

#-I {}批定了替换字符串,字符串{}会被从stdin读取到的参数所替换,使用-I时,能循环按要求替换相应的参数

实例应用4,结合find使用xargs

前面已经举过例子,这里要注意的是文件名称定界符要以字符null来分隔输出,如下所示,否则可能会误删文件

复制代码代码如下:

[email protected]:~/learn$ find . -type f -name "*test*.txt" -print0 | xargs -0 rm -f

其他:

复制代码代码如下:

cat file | ( while read arg; do cat $arg; done )
cat file | xargs -I {} cat {}

时间: 2024-10-17 00:23:39

linux shell脚本学习xargs命令使用详解的相关文章

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

xargs在linux中是个很有用的命令,它经常和其他命令组合起来使用,非常的灵活.xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理.由此 这个命令也是后置引用的一个强有力的替换.在一般使用过多参数的命令替换失败的时候,用xargs来替换它一般都能成功.通常情况下,xargs从管道或 者stdin中读取数据,但是它也能够从文件的输出中读取数据.xargs的默认命令是echo.这意味着通过管道传递给xargs的输入将

转 linux下xargs命令用法详解

xargs在linux中是个很有用的命令,它经常和其他命令组合起来使用,非常的灵活. xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理.由此 这个命令也是后置引用的一个强有力的替换.在一般使用过多参数的命令替换失败的时候,用xargs来替换它一般都能成功.通常情况下,xargs从管道或 者stdin中读取数据,但是它也能够从文件的输出中读取数据. xargs的默认命令是echo.这意味着通过管道传递给xargs的输

linux shell脚本学习笔记一

一.文件比较运算符-e filename 如果 filename存在,则为真 [ -e /var/log/syslog ]-d filename 如果 filename为目录,则为真 [ -d /tmp/mydir ]-f filename 如果 filename为常规文件,则为真 [ -f /usr/bin/grep ]-L filename 如果 filename为符号链接,则为真 [ -L /usr/bin/grep ]-r filename 如果 filename可读,则为真 [ -r

linux下find(文件查找)命令的详解

文件查找命令locate和find详解 locate 配合数据库缓存,快速查看文件位置,非实时查找( 数据库查找) find 实际搜寻硬盘查询文件名称 ,实时查找 locate简介 locate命令其实是find -name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb,这个数据库中含有本地所有文件信息.Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件.为了避免这种情况,可以在

linux shell 之 crontab(定时任务)详解

1.定义: crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行.该词来源于希腊语 chronos(χρνο),原意是时间.常,crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行.这类作业一般称为cron jobs. 2.安装(默认自带crontab) 假如执行crontab报下面的错误即需要安装一下. -bash: cr

linux shell 脚本学习总结

shell 编程: shell 开头必须指定bash:#!/bin/bash shell 的执行方式: 1.  ./1.sh    执行当前目录下的1.sh,1.sh要是可执行文件 2.  bash  /usr/local/1.sh 定义变量   aa=’qqq’        =两侧不能有空格,使用变量 ${aa} Shell特殊含义变量 $$ 取当前脚本的进程id,就是pid $0  取当前文件名 $n  n是大于0的数字,n是几就是第几个参数 $#  取参数的个数 $* 取所有参数 $?

linux shell脚本学习(三)

1.在grep中, ^标记着单词的开始, $ 标记着单词的结束. 查看一个单词是否在linux自带的词典中,脚本如下: #bin/sh #文件名:checkword.sh word=$1 grep "^$1$"  /usr/share/dict/american-english -q if [ $? -eq 0 ]; then echo $word is a dictionary word; else echo $word is not a dictionary word; fi 2.

Linux shell脚本学习和实战之一

1.在/test目录下使用for循环创建10个文件如:test-1,test-2,...test-10mkdirsh.sh#!/bin/bashfor i in `seq 10`do [ ! -d /test ] && mkdir -p /testtouch /test/test-$idonechmod +x mkdirsh.sh 2.在/test目录下快速创建10个文件的方法如:test-1,test-2,...test-10[[email protected] test]# touch

Linux下的搜索查找命令的详解(find)

4.find Linux下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下.即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权限. 在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间 4.1.命令格式: find pathname -opt