Linux 使用xargs和两个参数并行下载
这是一个后续问题 我目前有以下脚本:Linux 使用xargs和两个参数并行下载,linux,bash,shell,wget,xargs,Linux,Bash,Shell,Wget,Xargs,这是一个后续问题 我目前有以下脚本: 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
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--加载cookies~/.urs\u cookies--保存cookies~/.urs\u cookies--auth no challenge=on--keep session cookies--content disposition$1
}
导出-f下载\u数据
目录=$(目录名“$1”)
如果您可以使用GNU并行而不是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 {}
export
的意义在于使变量在子shell中可见
您已经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' _
我认为您希望在传递给
bash
之前替换$DIR
,但需要$arg
保持不变。对于arg,请尝试bash-c”;下载\u data$DIR\$arg;done”
删除Charles Duffy对上一个问题的答案中的双引号显然是一个糟糕的决定。即使您知道数据不需要引用,我们也不知道,而且世界上已经有太多的shell脚本片段带有不正确的引用。非常感谢,正是缺少的导出!由于dirname没有改变,我直接在函数中访问$dir。它就像一个符咒。快速提问:将私有变量大写只是一个惯例问题,还是在Bash中有实际效果?非常感谢您的帮助。POSIX为系统变量保留了大写字母。谢谢你的回答。我更喜欢xargs方法,因为如果我没有弄错的话,它是随cygwin安装而来的,而并行需要在安装之后下载。而且,由于这个脚本将被其他人使用,因此任何人使用它只需少走一步。但还是要感谢您。请注意,GNU Parallel本质上是一个单独的Perl脚本,如果您要分发脚本,GPL允许您在它旁边分发GNU Parallel:
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' _
<$1 xargs -d $'\n' -P 5 -n 1 -- bash -c 'for arg; do
download_data "$0" "$arg"; done' "$(dirname "$1")"