【问题标题】:xargs for multiple arguments, each with two inputsxargs 用于多个参数,每个参数有两个输入
【发布时间】:2021-02-05 08:41:32
【问题描述】:

我有一个 script.sh,它只是一个 wget:

wget https://stuff/$1/$2/etc

基本上,每次运行脚本时,我都需要输入两个参数 $1 和 $2,并且我需要多次执行此操作(我有数百个文件要下载遵循这种类型的路径)。

我熟悉如何使用 xargs 读取 .txt 文件并将每一行输入到参数中,但是当每行有 2 个输入时,我不确定如何执行此操作。

【问题讨论】:

    标签: bash xargs


    【解决方案1】:

    调用你的脚本

    默认情况下,xargs 在每个命令中填充尽可能多的参数。这些参数是在同一行还是在不同的行中重要。

    您可以使用 -n 限制每个命令的参数数量

    xargs -n 2 yourWgetScript.sh < yourFile
    

    或者,如果文件在一行中列出每个调用的参数,您可以指示xargs 每行而不是每两个参数执行一个新命令

    xargs -L 1 yourWgetScript.sh < yourFile
    

    如果您的文件格式为

    cmd1-arg1 cmd1-arg2
    cmd2-arg1 cmd2-arg2
    cmd3-arg1 cmd3-arg2
    ...
    

    并且没有尾随空格、特殊符号等,那么这两个命令是等价的。但请记住,xargs 有自己的转义机制。如果某些参数包含空格或\"',则必须使用\ 对其进行转义。

    更高效的替代方案

    使用以下脚本而不是xargs yourWgetScript 可能会更快,因为后者会重复启动一个shell 一个wget 进程,用于每个 URL,可以是很慢。

    awk '{print "https://stuff/" $1 "/" $2 "/etc"}' yourFile | xargs wget
    

    【讨论】:

    • 所以在xargs -n 2的情况下,我的文件在第一行是$1,在第二行是$2,在第三行是$1,在第四行是$2,依此类推,对吗?而对于-L 1,我可以将 1 美元和 2 美元放在同一行。使用 awk 时,我的文件会是什么样子?
    • 使用-n 2,您可以在不同的行中有$1$2,但没有必要。如果一行中有数千个参数,那就更好了;或者一行有一个参数,然后一行有两个参数,然后一行有三个参数,依此类推。 ¶ 对于-L 1awk,参数$1$2 必须 始终位于同一行。对于这两种解决方案,每行恰好需要两个参数。
    猜你喜欢
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 2016-10-19
    相关资源
    最近更新 更多