帮助使用xargs将多个文件名传递给shell脚本

时间:2011-08-30 21:04:51

标签: shell unix

有人可以告诉我正确使用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获取基名?我认为这必须是一个单独的问题。

4 个答案:

答案 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

findxargs联系起来时,通常首选NULL终止,我建议将-print0选项附加到find。在此之后,您必须将-0添加到xargs,因此它会期望NULL终止参数。这可确保正确处理文件名。这不是POSIX正确的,但被认为得到了很好的支持。如果命令缺乏支持,您可以随时删除NULL终止选项。

记住find的目的是查找文件,xargs更通用。我经常使用xargs来处理非文件名参数。