这个问题是another one asked some time ago的后续行动。
我目前有这个脚本:
download_data(){
wget --load-cookies ~/.urs_cookies --save-cookies ~/.urs_cookies --auth-no-challenge=on --keep-session-cookies --content-disposition $1
}
export -f download_data
DIR=$(dirname "$1")
<$1 xargs -d $'\n' -P 5 -n 1 -- bash -c 'for arg; do download_data $arg; done' _
换句话说,我有一个包含大量网址的文本文件,每行一个,我将每个网址都提供给wget以下载数据。
我想要做的是向download_data()添加另一个参数,以便选择文件的下载位置。类似的东西:
download_data(){
wget -P $1 --load-cookies ~/.urs_cookies --save-cookies ~/.urs_cookies --auth-no-challenge=on --keep-session-cookies --content-disposition $2
}
export -f download_data
DIR=$(dirname "$1")
<$1 xargs -d $'\n' -P 5 -n 1 -- bash -c 'for arg; do download_data $DIR $arg; done' _
理论上,这会将文件保存在我的文本文件的位置。但它不起作用:传递给download_data()的第一个参数始终为空。
我非常喜欢bash和所有这些,所以这可能是一件简单的事情......
感谢您的帮助!
答案 0 :(得分:1)
如果您可以使用GNU Parallel而不是xargs:
download_data(){
wget -P $1 --load-cookies ~/.urs_cookies --save-cookies ~/.urs_cookies --auth-no-challenge=on --keep-session-cookies --content-disposition $2
}
export -f download_data
DIR=$(dirname "$1")
parallel -a $1 -P5 download_data $DIR {}
答案 1 :(得分:1)
export
的重要性是使变量在子壳中可见。
你已经export -f
你的职能;同样,export
也是DIR
变量。
但是,您不应该使用大写字母作为私有变量。你打破了报价。所以,
download_data(){
# add missing double quotes
wget -P "$1" --load-cookies ~/.urs_cookies --save-cookies ~/.urs_cookies --auth-no-challenge=on --keep-session-cookies --content-disposition "$2"
}
export -f download_data
# lowercase variable name
dir=$(dirname "$1")
# ... and export it
export dir
# ... and fix quoting some more
<$1 xargs -d $'\n' -P 5 -n 1 -- bash -c 'for arg; do
download_data "$dir" "$arg"; done' _
您可能想知道_
命令行末尾的xargs
。不明确或优雅地,我们也可以使用它来走私价值。它将用于在单引号内的脚本中填充$0
。然后,我们不需要将它放在命名变量中,或export
该变量。
<$1 xargs -d $'\n' -P 5 -n 1 -- bash -c 'for arg; do
download_data "$0" "$arg"; done' "$(dirname "$1")"