【发布时间】:2021-02-05 08:41:32
【问题描述】:
我有一个 script.sh,它只是一个 wget:
wget https://stuff/$1/$2/etc
基本上,每次运行脚本时,我都需要输入两个参数 $1 和 $2,并且我需要多次执行此操作(我有数百个文件要下载遵循这种类型的路径)。
我熟悉如何使用 xargs 读取 .txt 文件并将每一行输入到参数中,但是当每行有 2 个输入时,我不确定如何执行此操作。
【问题讨论】:
我有一个 script.sh,它只是一个 wget:
wget https://stuff/$1/$2/etc
基本上,每次运行脚本时,我都需要输入两个参数 $1 和 $2,并且我需要多次执行此操作(我有数百个文件要下载遵循这种类型的路径)。
我熟悉如何使用 xargs 读取 .txt 文件并将每一行输入到参数中,但是当每行有 2 个输入时,我不确定如何执行此操作。
【问题讨论】:
默认情况下,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 1 和awk,参数$1 和$2 必须 始终位于同一行。对于这两种解决方案,每行恰好需要两个参数。