【问题标题】:help using xargs to pass mulitiple filenames to shell script帮助使用 xargs 将多个文件名传递给 shell 脚本
【发布时间】:2011-08-30 21:04:50
【问题描述】:

有人可以告诉我正确使用 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,我发现我的&lt;localfile&gt; 文件名输入和find 也给了我完整的路径。 /path/filename.dat 而不是 filename.dat。有没有办法从find 获取基本名称?我认为这必须是一个单独的问题。

【问题讨论】:

    标签: shell unix


    【解决方案1】:

    我会在这里使用find -exec

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

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

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

    【讨论】:

    • 关闭。我仍然在运行它时遇到问题。我认为正在发生的事情是 find 现在给了我文件名和路径 /path/filename.dat 而我只需要基本名称。
    • @jdamae:如果./test.sh 需要基本名称,则应将其更改为调用basename。否则,您也许可以使用-exec ./test.sh /staging/data/project/ $(basename {}) projectZ \;(未经测试)。
    • 这基本上回答了我的问题。谢谢你。我想我必须发布另一个关于仅从 find 中提取输出的基本名称的问题。
    【解决方案2】:

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

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

    记住:

    • find -exec 用于当您想对 one 文件运行命令时,针对每个文件。
    • xargs 只运行一个命令一次,使用所有文件作为参数。

    【讨论】:

    • 感谢您澄清每个 cmd 之间的使用。
    • @jdamae:这不是xargs 的强制行为,我正在用正确的xargs 选项写一个正确的答案。
    【解决方案3】:

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

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

    【讨论】:

    • 一次执行一个。感谢您的回复。我在开始测试 exec 时编辑了我的问题。
    【解决方案4】:

    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 来处理非文件名参数。

    【讨论】:

      猜你喜欢
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      相关资源
      最近更新 更多