【问题标题】:How to execute a command with one parameter at a time in the *nix shell?如何在 *nix shell 中一次执行带有一个参数的命令?
【发布时间】:2026-02-09 17:00:01
【问题描述】:

例如 svn log 等一些命令只会从命令行输入一个输入,所以我不能说grep 'pattern' | svn log。它只会返回第一个文件的信息,所以我需要分别对每个文件执行 svn log。

我可以使用 find 的 exec 选项来做到这一点:find -name '*.jsp' -exec svn log {} \;。但是,grep 和 find 提供不同的功能,并且 -exec 选项不适用于 grep 或许多其他工具。

那么有没有一种通用的方法可以从 unix 命令行工具获取输出,并让它像 find 一样对每个独立的输出执行任意命令?

【问题讨论】:

标签: linux unix command-line find grep


【解决方案1】:

答案是xargs -n 1

echo moo cow boo | xargs -n 1 echo

输出

哞 牛 嘘

【讨论】:

    【解决方案2】:

    试试 xargs:

    grep 'pattern' | xargs svn log
    

    【讨论】:

    • 我投票支持这个。为什么投反对票? svn log 确实需要多个参数,虽然这个答案并不能完全回答问题,但实际上它可能是使用 xargs 的更好方法。
    【解决方案3】:

    一个小的一次性 shell 脚本(使用 xargs 是一个更好的一次性,这就是它存在的原因)

    #!/bin/sh
    
    # Shift past argv[0]
    shift 1
    
    for file in "$@"
    do
            svn log $file
    done
    

    您可以将其命名为“multilog”或类似名称。像这样称呼它:

    ./multilog.sh foo.c abc.php bar.h Makefile

    当被自动构建脚本调用时,它允许更多的理智,即在与 SVN 对话之前测试每个输出的存在,或将每个输出重定向到单独的文件,将其插入 sqlite 数据库等。

    这可能是也可能不是您想要的。

    【讨论】:

      最近更新 更多