2009-03-13

xargs命令

系统对命令行参数的长度是有限制的,用xargs --show-limits可以看到限制
$ xargs --show-limits
Your environment variables take up 1583 bytes
POSIX upper limit on argument length (this system): 1044945
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 1043362
Size of command buffer we are actually using: 1044945

xargs就用于参数的长度超出限制的情况.xargs通过分割参数,然后多次执行命令来打破这个限制.
下面讲解一下它的常用参数
-a file 这个命令的意思让xargs从file里读取它要分割的参数. 默认情况下,xargs是从标准输入读取的.
$ ls * > xargs.file

$ xargs -a xargs.file ls -l
-rw-r--r-- 1 Administrator None 2 Mar 3 20:20 4
-rw-r--r-- 1 Administrator None 0 Feb 28 19:49 4]]
-rw-r--r-- 1 Administrator None 87 Mar 5 20:22 awk.test
-rwxr-xr-x 1 Administrator None 409 Mar 3 22:24 bc.test
-rwxrwxrwx 1 Administrator None 411 Mar 3 22:23 bc.test.bak
-rw-r--r-- 1 Administrator None 48 Feb 21 21:06 func.test
-rw-r--r-- 1 Administrator None 25 Feb 27 21:37 grep.test
...

$ ls | xargs ls -l
-rw-r--r-- 1 Administrator None 2 Mar 3 20:20 4
-rw-r--r-- 1 Administrator None 0 Feb 28 19:49 4]]
-rw-r--r-- 1 Administrator None 87 Mar 5 20:22 awk.test
-rwxr-xr-x 1 Administrator None 409 Mar 3 22:24 bc.test
-rwxrwxrwx 1 Administrator None 411 Mar 3 22:23 bc.test.bak
-rw-r--r-- 1 Administrator None 48 Feb 21 21:06 func.test
-rw-r--r-- 1 Administrator None 25 Feb 27 21:37 grep.test
...


-0 这个参数表示xargs要分割的参数是以空字符隔开的.默认情况下是以空格或换行符隔开的.这个参数的作用和find命令的-print0,perl的-0作用是一样的.

注意上图"for?note"这个文件的名字包含有换行符.没有使用-0选项行,xargs把这个文件名拆成两部分了,所以ls找不到文件;使用-0选项后就正确了.

-d delimiter 除了使用默认的空格,换行符和空字符来分隔参数以外,还可以用这个选项来指定分隔符

-I rep-str 这个选项用于把xargs要执行的命令的参数里rep-str替换成xargs分割得来的参数.作用就像find命令里的-exec选项把{}替换成文件名一样
$ cat sed.write
hello
myboy

$ ls sed.write | xargs -I HELLO cat HELLO
hello
myboy


-L max 指定xargs每次最多传送max参数给xargs要执行的命令.(注意ls的每个输出以换行符分隔)
$ ls sed.* | xargs echo hello
hello sed.test sed.write

$ ls sed.* | xargs -L 1 echo hello
hello sed.test
hello sed.write


-n max 指定xargs每次最多传送max参数给xargs要执行的命令.(注意echo的输出以空格分隔)
$ echo sed.test sed.write | xargs echo hello
hello sed.test sed.write

$ echo sed.test sed.write | xargs -n 1 echo hello
hello sed.test
hello sed.write

$ echo sed.test sed.write | xargs -L 1 echo hello
hello sed.test sed.write


-p 每次执行命令之前都询问用户
$ ls | xargs -p -n 4 ls -l
ls -l 4 4]] awk.test bc.test ?...n
ls -l bc.test.bak func.test grep.test kk ?...n
ls -l log.test orld perl.test perl.test~ ?...y
ls -l sed.test sed.write xargs.file ?...-rw-r--r-- 1 Administrator None 5 Mar
8 15:11 log.test
-rw-r--r-- 1 Administrator None 0 Feb 27 21:22 orld
-rw-r--r-- 1 Administrator None 301 Mar 12 21:49 perl.test
-rw-r--r-- 1 Administrator None 141 Mar 12 21:39 perl.test~


-t 每次都输出要执行命令的命令
$ ls sed* | xargs -t ls -l
ls -l sed.test sed.write <== -t选项输出了这行
-rw-r--r-- 1 Administrator None 6 Mar 6 20:22 sed.test
-rw-r--r-- 1 Administrator None 12 Feb 27 21:32 sed.write


转载请注明出处 http://fornote.blogspot.com

没有评论:

发表评论