linuxshell脚本学习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
2. 获得/etc/ 下所有*.conf 结尾的⽂件列表,有⼏种不同的⽅法能得到相同的结果,下⾯的例⼦仅仅是⽰范怎么实⽤xargs ,在这个例⼦中实⽤ xargs将find 命令的输出传递给ls -l
# find /etc -name "*.conf" | xargs ls –l
3. 假如你有⼀个⽂件包含了很多你希望下载的URL, 你能够使⽤xargs 下载所有链接
# | xargs wget –c
4. 查所有的jpg ⽂件,并且压缩它
# find / -name *.jpg -type f -print | xargs tar -cvzf
5. 拷贝所有的图⽚⽂件到⼀个外部的硬盘驱动
# 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 "$@" < /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`
linux执行shell命令如果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,将多⾏输⼊转换为单⾏输出:
复制代码代码如下:
amosli@amosli-pc:~/learn$
1 2 3 4 5
6 7
8
amosli@amosli-pc:~/learn$ | xargs
1 2 3 4 5 6 7 8
实例应⽤2,将单⾏输⼊转换为多⾏输出:
复制代码代码如下:
amosli@amosli-pc:~/learn$ | xargs -n 2
1 2
3 4
5 6
7 8
空格是默认的定界符,-n 表⽰每⾏显⽰⼏个参数
还可以使⽤-d参数来分隔参数,如下:
复制代码代码如下:
amosli@amosli-pc:~/learn$ echo "splitXhiXamosliXsplit" | xargs -d "X" -n 1
split
hi
amosli
split
实例应⽤3,读取stdin,将格式化参数传递给命令
复制代码代码如下:
#定义⼀个echo命令每次在输出参数后都加上#
amosli@amosli-pc:~/learn$ cat cecho.sh
echo $*'#'
#需求1:输出多个参数
amosli@amosli-pc:~/learn$ sh cecho.sh arg1
arg1#
amosli@amosli-pc:~/learn$ sh cecho.sh arg2
arg2#
amosli@amosli-pc:~/learn$ sh cecho.sh arg3
arg3#
#需求2:⼀次性提供所有的命令参数
amosli@amosli-pc:~/learn$ sh cecho.sh arg1 arg2 arg3
arg1 arg1 arg2 arg3#
#针对需求1、2,使⽤xargs代替,先⽤vi建⼀个新⽂件,如下:
amosli@amosli-pc:~/learn$
arg1
arg2
arg3
#批量输出参数:
amosli@amosli-pc:~/learn$ | xargs -n 1
arg1
arg2
arg3
amosli@amosli-pc:~/learn$ | xargs -n 2 sh cecho.sh
arg1 arg2#
arg3#
#⼀次性输出所有参数:
amosli@amosli-pc:~/learn$ | xargs sh cecho.sh ;
arg1 arg2 arg3#
需求3,如何将参数嵌⼊到固定的命令⾏中?如下所⽰:
复制代码代码如下:
amosli@amosli-pc:~/learn$ sh cecho.sh -p args1 -1
-p args1 -1#
amosli@amosli-pc:~/learn$ sh cecho.sh -p args2 -1
-p args2 -1#
amosli@amosli-pc:~/learn$ sh cecho.sh -p args3 -1
-p args3 -1#
使⽤xargs的解决⽅案:
复制代码代码如下:
amosli@amosli-pc:~/learn$ | xargs -I {} sh cecho.sh -p {} -1
-p arg1 -1#
-p arg2 -1#
-
p arg3 -1#
#-I {}批定了替换字符串,字符串{}会被从stdin读取到的参数所替换,使⽤-I时,能循环按要求替换相应的参数实例应⽤4,结合find使⽤xargs
前⾯已经举过例⼦,这⾥要注意的是⽂件名称定界符要以字符null来分隔输出,如下所⽰,否则可能会误删⽂件复制代码代码如下:
amosli@amosli-pc:~/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 {}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论