在Unix中使用xargs
应用程序的示例如下:
ls | xargs echo
这是相同的(假设我在工作目录中有someFile
和someDir/
):
echo someFile someDir
所以xargs
获取它的输入并将其放在下一个命令的末尾(这里是echo的末尾)。
但有时我希望xargs
将其输入放在下一个命令的中间位置。
举例来说:
find . -type f -name "*.cpp" -print | xargs g++ -o outputFile
因此,如果我在当前目录中有a.cpp
,b.cpp
,c.cpp
文件,输出将与命令相同:
g++ -o outputFile a.cpp b.cpp c.cpp
但我想要这样的东西
g++ a.cpp b.cpp c.cpp -o outputFile
有办法做到吗?
PS:在某些情况下,我需要它,因为例如:
i586-mingw32msvc-g++ -o outputFile `pkg-config --cflags --libs gtkmm-2.4` a.cpp b.cpp c.cpp
不工作,但这一个工作得很好:
i586-mingw32msvc-g++ a.cpp b.cpp c.cpp -o outputFile `pkg-config --cflags --libs gtkmm-2.4`
4条答案
按热度按时间xzlaal3s1#
如果您的xargs版本不包含
-I
功能,那么另一种方法是编写一个包含您想要执行的命令的小shell脚本:然后使用xargs运行:
mlnl4t2r2#
您不需要
xargs
来执行此操作。只需用途:slwdgvem3#
GNU Parallel http://www.gnu.org/software/parallel/也是一个解决方案:
twh00eeo4#
为了回答标题中提出的原始问题,如何使用
xargs
将输入放在中间而不是结尾:这将用管道输出替换命令中的
{}
。BSD和GNU xargs之间有一些细微的区别,如下所述:BSD xargs(例如在MacOS/达尔文,freebsd)
使用
-I REPLACE
,它将替换命令中的字符串REPLACE
(或您传递的任何内容)。举例来说:man page描述了该选项:
GNU xargs(例如:在Linux上)
使用
-I REPLACE
或-i
参数,如the man page所述:-I
上的-L 1
意味着它将在单独的命令中执行每个输入: