有人可以告诉我正确使用xargs吗?或者如果不是xargs,我应该使用什么unix命令?
我基本上想输入多于(1)输入<localfile>
的文件名,第三个输入参数。
例如:
1. use `find` to get list of files
2. use each filename as input to shell script
shell脚本的用法:
test.sh <localdir> <localfile> <projectname>
我的尝试,但没有工作:
find /share1/test -name '*.dat' | xargs ./test.sh /staging/data/project/ '{}' projectZ \;
修改
在得到每个人的一些意见并尝试-exec
之后,我发现我<localfile>
文件名输入find
也给了我完整的路径。 /path/filename.dat
代替filename.dat
。有没有办法从find
获取基名?我认为这必须是一个单独的问题。
答案 0 :(得分:4)
我在这里使用find -exec
:
% find /share1/test -name '*.dat' -exec ./test.sh /staging/data/project/ {} projectZ \;
对于./test.sh
下的每个.dat
文件,这将使用您的三个参数调用/share1/test
。
xargs
将收集所有这些文件名并将其传递给./test.sh
的一个调用,这看起来不像您想要的行为。
答案 1 :(得分:4)
如果要为每个文件执行shell脚本(而不是在整个文件列表中只执行一次),您可能希望使用find -exec
:
find /share1/test -name '*.dat' -exec ./test.sh /staging/data/project/ '{}' projectZ \;
记住:
find -exec
用于在一个文件上为每个文件运行命令。xargs
只运行一次命令,使用 all 文件作为参数。答案 2 :(得分:2)
xargs尽可能多地填充命令行末尾的文件。 您想一次在一个文件上执行脚本还是所有文件?对于一次一个,使用文件的exec,看起来你已经在使用它的语法,xargs不使用:
find /share1/test -name '*.dat' -exec ./test.sh /staging/data/project/ '{}' projectZ \;
答案 3 :(得分:0)
xargs
不必组合参数,它只是默认行为。这正确地使用xargs
来按预期执行命令。
find /share1/test -name '*.dat' -print0 | xargs -0 -I'{}' ./test.sh /staging/data/project/ '{}' projectZ
将find
与xargs
联系起来时,通常首选NULL终止,我建议将-print0
选项附加到find
。在此之后,您必须将-0
添加到xargs
,因此它会期望NULL终止参数。这可确保正确处理文件名。这不是POSIX正确的,但被认为得到了很好的支持。如果命令缺乏支持,您可以随时删除NULL终止选项。
记住find
的目的是查找文件,xargs
更通用。我经常使用xargs
来处理非文件名参数。