Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
帮助使用xargs将多个文件名传递给shell脚本_Shell_Unix - Fatal编程技术网

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

帮助使用xargs将多个文件名传递给shell脚本,shell,unix,Shell,Unix,有人能告诉我如何正确使用xargs吗?如果不是xargs,我应该使用什么unix命令 我基本上想输入超过(1)个文件名作为输入,第三个输入参数 例如: 1. use `find` to get list of files 2. use each filename as input to shell script shell脚本的用法: test.sh <localdir> <localfile> <projectname> 编辑: 在大家输入了一些内容并尝

有人能告诉我如何正确使用xargs吗?如果不是xargs,我应该使用什么unix命令

我基本上想输入超过(1)个文件名作为输入
,第三个输入参数

例如:

1. use `find` to get list of files
2. use each filename as input to shell script
shell脚本的用法:

test.sh <localdir> <localfile> <projectname>
编辑: 在大家输入了一些内容并尝试执行
-exec
之后,我发现我的
文件名输入和
查找也提供了完整路径
/path/filename.dat
而不是
filename.dat
。有没有办法从
find
获取basename?我想这将是一个单独的问题。

我只想在这里使用:

这将为
/share1/test
下的每个
.dat
文件调用一次带有三个参数的
/test.sh


将打包所有这些文件名并将它们传递到一次调用
/test.sh
,这看起来不像您想要的行为。

xargs将尽可能多的文件填充到命令行的末尾。 您想一次在一个文件上执行脚本还是在所有文件上执行脚本?对于一次一个,请使用文件的exec,看起来您已经在使用该文件的语法,但xargs没有使用:

find /share1/test -name '*.dat' -exec ./test.sh /staging/data/project/ '{}' projectZ \;

如果要为每个文件执行shell脚本(而不是在整个文件列表中只执行一次),则可能需要使用
find-exec

find /share1/test -name '*.dat' -exec ./test.sh /staging/data/project/ '{}' projectZ \;
记住:

  • find-exec
    用于在一个文件上为每个文件运行命令
  • xargs
    只运行一次命令,使用所有文件作为参数

    • xargs
      不必组合参数,它只是默认行为。这将正确地使用
      xargs
      ,按预期执行命令

      find /share1/test -name '*.dat' -print0 | xargs -0 -I'{}' ./test.sh /staging/data/project/ '{}' projectZ
      
      find
      配管到
      xargs
      时,通常首选空端接,我建议将
      -print0
      选项附加到
      find
      。在此之后,必须将
      -0
      添加到
      xargs
      ,因此它将使用以NULL结尾的参数。这确保了文件名的正确处理。它不适合POSIX,但被认为得到了很好的支持。如果您的命令不受支持,则始终可以删除NULL终止选项


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

      。我运行它仍然有问题。我认为正在发生的是find现在给了我文件名和路径
      /path/filename.dat
      ,我只需要basename。@jdame:如果
      /test.sh
      需要basename,那么应该将其更改为call。您可以执行
      -exec./test.sh/staging/data/project/$(basename{})projectZ\否则(未测试)。这基本上回答了我的问题。非常感谢。我想我必须发布另一个问题,关于从find.execute一次只提取输出的basename。谢谢你的回复。我在开始测试
      exec
      时编辑了我的问题。感谢您澄清了每个cmd之间的用法。@jdame:这不是
      xargs
      的强制行为,我正在用正确的
      xargs
      选项编写正确的答案。
      find /share1/test -name '*.dat' -exec ./test.sh /staging/data/project/ '{}' projectZ \;
      
      find /share1/test -name '*.dat' -print0 | xargs -0 -I'{}' ./test.sh /staging/data/project/ '{}' projectZ