Xargs命令的含义及使用

jackxiang 2009-12-17 17:33 | |
1、在“linux下批量修改文件名”中使用到了此命令,将源文件批量mv的时间,将上一个命令的输出作为参数传入下一命令,比你个执行下一命令。
find -name ‘*.jpg’ -printf %f \\n|grep -v ^[0-9] |grep -v logo.jpg|awk -F ‘.’ ‘{print $1}’|
xargs -i{} mv {}.jpg `date +%Y%m%d`{}.jpg

find ./ -name tmp -type f -print | xargs /bin/rm -f
找到tmp文件,删除。

find ./ -name tmp -type f -print | xargs -0 /bin/rm -f
找到tmp文件,删除。当文件名字包含新行或空格时使用。

cut -d: -f1 < /etc/passwd | sort | xargs echo
列举用户。

find ./ -type f -print | xargs -i mv -f {}  `date +%Y%m%d`{}
文件重命名的批量方法,加上时间戳。

2、首先进行的一个测试
–列出所有用户
root@test-177-ce0 # cut -d : -f 1 root
daemon
bin
sys
adm
lp
uucp
nuucp
smmsp
listen
gdm
webservd
postgres
svctag
nobody
noaccess
nobody4
lyj
oracle
syslog

–排序
root@test-177-ce0 # cut -d : -f 1 adm
bin
daemon
gdm
listen
lp
lyj
noaccess
nobody
nobody4
nuucp
oracle
postgres
root
smmsp
svctag
sys
syslog
uucp
webservd

–打印输出
root@test-177-ce0 # cut -d : -f 1 adm bin daemon gdm listen lp lyj noaccess nobody nobody4 nuucp oracle postgres root smmsp svctag sys syslog uucp webservd

相当于如下命令,定义参数并且使用。
root@test-177-ce0 # x=`cut -d : -f 1 root@test-177-ce0 # echo $x
adm bin daemon gdm listen lp lyj noaccess nobody nobody4 nuucp oracle postgres root smmsp svctag sys syslog uucp webservd

3、使用介绍
root@test-177-ce0 # xargs –help
xargs:非法选项 — help
xargs:用法 xargs: [-t] [-p] [-e[eofstr]] [-E eofstr] [-I replstr] [-i[replstr]] [-L #] [-l[#]] [-n # [-x]] [-s size] [cmd [args ...]]

把一条命令在标准输出上的输出结果,转换为另一个程序或或者另一个命令的参数。

构造参数列表并进行调用工具。
NAME
xargs – construct argument lists and invoke utility

SYNOPSIS
/usr/bin/xargs [-t]  [-p]  [  -e  [eofstr]]  [-E eofstr]  [-
I replstr]  [  -i  [replstr]]  [-L number]  [ -l [number]] [
-n number [-x]] [-s size] [ utility [ argument...]]

/usr/xpg6/bin/xargs [-t] [-p] [ -e [eofstr]] [-E eofstr]  [-
I replstr]  [  -i  [replstr]]  [-L number]  [ -l [number]] [
-n number [-x]] [-s size] [ utility [ argument...]]

DESCRIPTION
The xargs utility constructs a command  line  consisting  of
the  utility  and argument operands specified followed by as
many arguments read in sequence from standard input as  will
fit  in  length  and  number  constraints  specified  by the
options. The xargs utility then invokes the constructed com-
mand  line  and  waits  for its completion. This sequence is
repeated until an end-of-file condition is detected on stan-
dard  input  or  an invocation of a constructed command line
returns an exit status of 255.

Arguments  in  the  standard  input  must  be  separated  by
unquoted  blank characters, or unescaped blank characters or
newline characters. A string of  zero  or  more  non-double-
quote  (”)  and  non-newline  characters  can  be  quoted by
enclosing them in double-quotes. A string of  zero  or  more
non-apostrophe  (’) and non-newline characters can be quoted
by enclosing them in apostrophes. Any unquoted character can
be escaped by preceding it with a backslash (\). The utility
will be executed one or more times until the end-of-file  is
reached. The results are unspecified if the utility named by
utility attempts to read from its standard input.

参数含义:

-i 选项:告诉 xargs 用每项的名称替换 {}。
find -name ‘*.jpg’ -printf %f \\n|grep -v ^[0-9] |grep -v logo.jpg|awk -F ‘.’ ‘{print $1}’|
xargs -i{} mv {}.jpg `date +%Y%m%d`{}.jpg

-t 选项指示 xargs 先打印命令,然后再执行。

-p 选项:它使操作具有可交互性:
要求您在运行每个命令之前进行确认。如果您按下 “y”,则执行命令,删除文件时的确认。

-t 选项:使用一个详细模式,显示要运行的命令。

-r 选项:没有要处理的内容,停止xargs;
$ file * | grep No | cut -d”:” -f1 | xargs -t -r wc -l $
如果没有要运行的内容,该命令退出。

-n 选项:限制单个命令行的参数个数。
如rm只能接受有限数量的参数。-n 选项限制单个限制单个命令行的参数个数。
向 xargs ls -ltr 传递五个文件,但每次向 ls -ltr 仅传递两个文件。
root@test-177-ce0 # file * | grep zip
js.zip:         ZIP
s2new.zip:      ZIP
seas.zip:       ZIP
root@test-177-ce0 # file * | grep zip | cut -d”:” -f1 | xargs -t -n2 ls -ltr
ls -ltr js.zip s2new.zip
-rw-r–r–   1 root     root      134756 1 17:32 js.zip
-rw-r–r–   1 root     root     214847212  14:32 s2new.zip
ls -ltr seas.zip
-rw-r–r–   1 root     root     243173439  15:15 seas.zip
root@test-177-ce0 #

4、Xargs的优势
1)统计文件中的行数
cut -d : -f 1显示第一个字段
file -Lz *,用于查找是符号链接或者经过压缩的文件
ls -ltr 命令,如下所示:

xargs 本身虽然没有多大用处,但在与其他命令相结合时,它的功能非常强大。
–统计文件的长度
root@test-177-ce0 # wc -l `file zianed.log |grep ascii|cut -d : -f 1|xargs cat`
98 /etc/opt/SUNWexplo/default/explorer
452 /opt/SUNWexplo/bin/explorer
550 total
–统计文本的长度
root@test-177-ce0 # file zianed.log |grep ascii|cut -d : -f 1|xargs cat|wc -l
2

2)快速批量重命名文件。
$ ls | xargs -t -i mv {} {}.bak

3)搜索文件,使用 vi 打开要编辑的文件时:
$ file * | grep ASCII | cut -d”:” -f1 | xargs vi
使用 vi 逐个打开文件。希望搜索多个文件并打开它们进行编辑时,使用该命令非常方便。

4、与管道的区别
管道是把一个命令的输出传递给另一个命令作为输入,比如:
command1 | command2
但是command2仅仅把输出的内容作为输入参数。

例子:
root@test-177-ce0 # file zianed.log |grep ascii|cut -d : -f 1|cat
zianed.log
root@test-177-ce0 # file zianed.log |grep ascii|cut -d : -f 1|xargs cat
/etc/opt/SUNWexplo/default/explorer
/opt/SUNWexplo/bin/explorer

xargs能把管道传来的字符串当作文件交给其后的命令执行。要对匹配文件操作时,使用find and xargs。
xargs是shell命令的一个,可以把管道输入的内容转化为其参数要操作的文件。

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/2343/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!

评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]