使用 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 "")"
此问题是
我目前有这个脚本:
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 "")"