使用 xargs 和两个参数并行下载

Parallel downloading using xargs and two parameters

此问题是 的后续问题。

我目前有这个脚本:

download_data(){
    wget --load-cookies ~/.urs_cookies --save-cookies ~/.urs_cookies --auth-no-challenge=on --keep-session-cookies --content-disposition 
}

export -f download_data
DIR=$(dirname "")
< xargs -d $'\n' -P 5 -n 1 -- bash -c 'for arg; do download_data $arg; done' _

换句话说,我有一个包含很多 URL 的文本文件,每行一个,我将每个 URL 提供给 wget 以下载数据。

我想做的是在download_data()中添加另一个参数,以便select文件的下载位置。类似于:

download_data(){
    wget -P  --load-cookies ~/.urs_cookies --save-cookies ~/.urs_cookies --auth-no-challenge=on --keep-session-cookies --content-disposition 
}

export -f download_data
DIR=$(dirname "")
< xargs -d $'\n' -P 5 -n 1 -- bash -c 'for arg; do download_data $DIR $arg; done' _

理论上,这会将文件保存在我的文本文件的位置。但它不起作用:传递给 download_data() 的第一个参数始终为空。

我对 bash 和所有这一切都很菜鸟,所以这可能是一些简单的缺失...

感谢您的帮助!

如果您可以使用 GNU Parallel 而不是 xargs:

download_data(){
  wget -P  --load-cookies ~/.urs_cookies --save-cookies ~/.urs_cookies --auth-no-challenge=on --keep-session-cookies --content-disposition 
}
export -f download_data
DIR=$(dirname "")
parallel -a  -P5 download_data $DIR {}

export的意义在于使变量在子shell中可见。

您已经 export -f 您的功能;同样,export 您的 DIR 变量也是如此。

但是,您不应该为私有变量使用大写字母。你打破了报价。所以,

download_data(){
    # add missing double quotes
    wget -P "" --load-cookies ~/.urs_cookies --save-cookies ~/.urs_cookies --auth-no-challenge=on --keep-session-cookies --content-disposition ""
}

export -f download_data
# lowercase variable name
dir=$(dirname "")
# ... and export it
export dir
# ... and fix quoting some more
< xargs -d $'\n' -P 5 -n 1 -- bash -c 'for arg; do
    download_data "$dir" "$arg"; done' _

不过,您可能想知道 xargs 命令行末尾的 _。隐晦地或优雅地,我们也可以使用它来走私价值。它将用于在单引号内的脚本中填充 [=18=]。然后,我们不需要把它放在一个命名变量中,或者export那个变量。

< xargs -d $'\n' -P 5 -n 1 -- bash -c 'for arg; do
    download_data "[=11=]" "$arg"; done' "$(dirname "")"