8
22
2013
6

BSD 版 xargs

本文来自依云's Blog,转载请注明。

BSD 版 xargs 与 GNU 版有一个显著的不同——它支持-J选项。

比如说,你使用 find 命令得到了一个文件列表。你要将它们传递给一个叫concat_files的程序来处理后生成一个指定的新文件,比如:

concat_files file1 file2 file3 output

而且,这个命令不像 cp 或者 mv 那样,有个-t参数来把目标文件放到不定长的文件列表之前。总之呢,你不得不构建一行命令,它的中间部分是你会从管道传过去的文件列表。而 GNU xargs 要么全给你放末尾(默认),要么每项执行一次命令(指定-I时)。而 BSD xargs 则可以用-J选项指定一个占位符,使用这个占位符指明参数插入的位置:

find ... | xargs -J % concat_files % output

BSD xargs 的另一个特有参数是-o,作用你们就自己看文档啦=w=

我想在 Linux 上使用 BSD xargs,怎么办呢?在 AUR 里搜索到了这个,但是已经编译不过去了。安装 bmake 后手动边改边编译,最终终于成功编译了 obase 中的大多数工具。我知道的比较有特色的也就这个 xargs 了,于是单独打了个包 bsdxargs,放在我的 lilydjwg 源 里。

附,obase 的补丁:

diff --git a/Makefile b/Makefile
index 2bb18b4..96acf8a 100644
--- a/Makefile
+++ b/Makefile
@@ -8,6 +8,8 @@ LIBOBASE=${.CURDIR}/libobase/libobase.a
 INCLUDES_libobase=-isystem ${.CURDIR}/libobase/include
 COPTS_libobase=-D_GNU_SOURCE
 DPLIBS+=${LIBOBASE}
+LDADD+= ${LIBOBASE}
+.export LDADD
 .export COPTS DPLIBS HOSTCC HOSTCFLAGS USE_DPADD_MK

 SUBDIR=\
diff --git a/src/bin/ls/Makefile b/src/bin/ls/Makefile
index defd607..6ad4725 100644
--- a/src/bin/ls/Makefile
+++ b/src/bin/ls/Makefile
@@ -3,6 +3,6 @@
 PROG=  ls
 SRCS=  cmp.c ls.c main.c print.c util.c
 DPADD= ${LIBUTIL}
-LDADD= -lutil
+LDADD+= -lutil

 .include <bsd.prog.mk>
diff --git a/src/usr.bin/awk/Makefile b/src/usr.bin/awk/Makefile
index 54857d3..9d2d243 100644
--- a/src/usr.bin/awk/Makefile
+++ b/src/usr.bin/awk/Makefile
@@ -2,7 +2,7 @@

 PROG=  awk
 SRCS=  ytab.c lex.c b.c main.c parse.c proctab.c tran.c lib.c run.c
-LDADD= -lm
+LDADD+=    -lm
 DPADD= ${LIBM}
 CLEANFILES+=proctab.c maketab ytab.c ytab.h stamp_tabs
 CFLAGS+=-I. -I${.CURDIR} -DHAS_ISBLANK -DNDEBUG
diff --git a/src/usr.bin/dc/Makefile b/src/usr.bin/dc/Makefile
index b0a2396..f8ee358 100644
--- a/src/usr.bin/dc/Makefile
+++ b/src/usr.bin/dc/Makefile
@@ -3,7 +3,7 @@
 PROG=  dc
 SRCS=  dc.c bcode.c inout.c mem.c stack.c
 COPTS+= -Wall
-LDADD= -lcrypto
+LDADD+=    -lcrypto
 DPADD= ${LIBCRYPTO}

 .include <bsd.prog.mk>
diff --git a/src/usr.bin/du/Makefile b/src/usr.bin/du/Makefile
index feb644d..9676f37 100644
--- a/src/usr.bin/du/Makefile
+++ b/src/usr.bin/du/Makefile
@@ -2,6 +2,6 @@

 PROG=  du
 DPADD= ${LIBUTIL}
-LDADD= -lutil
+LDADD+= -lutil

 .include <bsd.prog.mk>
diff --git a/src/usr.bin/gzsig/Makefile b/src/usr.bin/gzsig/Makefile
index 0dc7b81..f4f0664 100644
--- a/src/usr.bin/gzsig/Makefile
+++ b/src/usr.bin/gzsig/Makefile
@@ -3,7 +3,7 @@
 PROG   = gzsig
 SRCS   = gzsig.c key.c sign.c ssh.c ssh2.c util.c verify.c x509.c

-LDADD  = -lcrypto -lm
+LDADD  += -lcrypto -lm
 DPADD  = ${LIBCRYPTO} ${LIBM}

 CLEANFILES += TAGS *~
diff --git a/src/usr.bin/lex/Makefile b/src/usr.bin/lex/Makefile
index 080a151..27a783e 100644
--- a/src/usr.bin/lex/Makefile
+++ b/src/usr.bin/lex/Makefile
@@ -17,7 +17,7 @@ SRCS= ccl.c dfa.c ecs.c gen.c main.c misc.c nfa.c parse.c sym.c tblcmp.c \
    yylex.c
 OBJS+= scan.o skel.o
 CLEANFILES+=parse.c parse.h scan.c skel.c y.tab.c y.tab.h
-LDADD= -lfl
+LDADD+=    -lfl
 DPADD= ${LIBL}

 MAN = flex.1
diff --git a/src/usr.bin/m4/Makefile b/src/usr.bin/m4/Makefile
index 7c510f5..16a282c 100644
--- a/src/usr.bin/m4/Makefile
+++ b/src/usr.bin/m4/Makefile
@@ -8,7 +8,7 @@ CFLAGS+=-DEXTENDED -I.
 CDIAGFLAGS=-W -Wall -Wstrict-prototypes -pedantic \
    -Wno-unused -Wno-char-subscripts -Wno-sign-compare

-LDADD= -ly -lfl -lm
+LDADD+= -ly -lfl -lm
 DPADD= ${LIBY} ${LIBL} ${LIBM}

 SRCS=  eval.c expr.c look.c main.c misc.c gnum4.c trace.c tokenizer.l parser.y
diff --git a/src/usr.bin/make/Makefile b/src/usr.bin/make/Makefile
index a63ed94..1d12280 100644
--- a/src/usr.bin/make/Makefile
+++ b/src/usr.bin/make/Makefile
@@ -14,7 +14,7 @@ CDEFS+=-DHAS_EXTENDED_GETCWD

 CFLAGS+=${CDEFS}
 HOSTCFLAGS+=${CDEFS}
-LDADD= -lrt
+LDADD+=    -lrt

 SRCS=  arch.c buf.c cmd_exec.c compat.c cond.c dir.c direxpand.c engine.c \
    error.c for.c init.c job.c lowparse.c main.c make.c memory.c parse.c \
diff --git a/src/usr.bin/mandoc/Makefile b/src/usr.bin/mandoc/Makefile
index cf565fd..6086a81 100644
--- a/src/usr.bin/mandoc/Makefile
+++ b/src/usr.bin/mandoc/Makefile
@@ -9,7 +9,7 @@ CFLAGS+=-W -Wall -Wstrict-prototypes
 CFLAGS+=-Wno-unused-parameter
 .endif

-LDADD= -ldb
+LDADD+= -ldb

 SRCS=  roff.c tbl.c tbl_opts.c tbl_layout.c tbl_data.c eqn.c mandoc.c read.c
 SRCS+= mdoc_macro.c mdoc.c mdoc_hash.c \
diff --git a/src/usr.bin/script/Makefile b/src/usr.bin/script/Makefile
index d7dbf01..8837084 100644
--- a/src/usr.bin/script/Makefile
+++ b/src/usr.bin/script/Makefile
@@ -1,7 +1,7 @@
 #  $OpenBSD: Makefile,v 1.3 1997/09/21 11:50:42 deraadt Exp $

 PROG=  script
-LDADD= -lutil
+LDADD+=    -lutil
 DPADD= ${LIBUTIL}

 .include <bsd.prog.mk>
diff --git a/src/usr.bin/ul/Makefile b/src/usr.bin/ul/Makefile
index bab290c..12295ec 100644
--- a/src/usr.bin/ul/Makefile
+++ b/src/usr.bin/ul/Makefile
@@ -2,6 +2,6 @@

 PROG=  ul
 DPADD= ${LIBCURSES}
-LDADD= -lcurses
+LDADD+=    -lcurses

 .include <bsd.prog.mk>
diff --git a/src/usr.bin/vacation/Makefile b/src/usr.bin/vacation/Makefile
index 6f08990..f9ef0d6 100644
--- a/src/usr.bin/vacation/Makefile
+++ b/src/usr.bin/vacation/Makefile
@@ -1,6 +1,6 @@
 #  $OpenBSD: Makefile,v 1.3 1997/09/21 11:51:42 deraadt Exp $

 PROG=  vacation
-LDADD= -ldb
+LDADD+=    -ldb

 .include <bsd.prog.mk>
diff --git a/src/usr.bin/wc/Makefile b/src/usr.bin/wc/Makefile
index 3f3c619..0f3d1a2 100644
--- a/src/usr.bin/wc/Makefile
+++ b/src/usr.bin/wc/Makefile
@@ -2,6 +2,6 @@

 PROG=  wc
 DPADD= ${LIBUTIL}
-LDADD= -lutil
+LDADD+= -lutil

 .include <bsd.prog.mk>

参见

Category: Linux | Tags: xargs BSD shell | Read Count: 5348
eleven.i386 说:
Aug 23, 2013 11:03:03 AM

介个, 你装了bsd系统? 还是从哪里得到这个xargs的?

Avatar_small
依云 说:
Aug 23, 2013 11:22:28 AM

从 obase 里编译的呀

MasterRay 说:
Aug 23, 2013 07:45:29 PM

不考量perl啓動速度的話,GNU parallel倒是不錯……BSD對應coreutils總給人比GNU殘缺很多的感覺,雖然有人吐槽GNU的是吐過口水的精美蛋糕

Avatar_small
依云 说:
Aug 23, 2013 08:22:17 PM

BSD 的东西都小很多嘛:

>>> ll =bsdxargs =xargs
-rwxr-xr-x 1 root root 14K 8月 22 22:47 /usr/bin/bsdxargs
-rwxr-xr-x 1 root root 43K 1月 27 2013 /usr/bin/xargs

parallel 主要在于并行计算吧,对于简单命令 overhead 比 xargs 高不少。

风间星魂 说:
Aug 27, 2013 10:14:21 AM

原来gnu版本的xargs没有-J等价啊?

还有。。发个帖还要输验证码也太。。。。。

Avatar_small
依云 说:
Aug 27, 2013 11:38:34 AM

我也不想啊,但是另一个选择是 akismet,从某天起所有评论都会被它视为垃圾评论了 @_@


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

部分静态文件存储由又拍云存储提供。 | Theme: Aeros 2.0 by TheBuckmaker.com