Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用xargs和两个参数并行下载_Linux_Bash_Shell_Wget_Xargs - Fatal编程技术网

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")"