1 概述
在WPS中,ungrib.exe
解析气象数据前会先链接GRIB气象数据(当然,不链接也行,拷贝过来也可以运行,但是非常浪费存储资源,因此使用软链接)为GRIBFILE.xxx
,链接气象数据的脚本为link_grib.csh
,以下对该脚本进行解读,加深对该过程的理解。
2 代码解读
link_grib.csh的代码内容为(#注释部分为解读):
#!/bin/csh -f # csh脚本标志
set alpha = ( A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ) # 用于链接文件的命名(GRIBFILE.xxx)
set i1 = 1 # 第一个x在alpha的索引
set i2 = 1 # 第二个x在alpha的索引
set i3 = 1 # 第三个x在alpha的索引
# ${#argv}表示获取传入的参数个数,${2}表示第二个参数
if ( ( ${#argv} == 1 ) || ( ( ${#argv} == 2 ) && ( ${2} == "." ) ) ) then
rm -f GRIBFILE.??? >& /dev/null # 清除已有的GRIBFILE.xxx
foreach f ( ${1}* ) # 对传入的第一个参数(为文件夹路径)下的所有文件进行遍历
ln -sf ${f} GRIBFILE.$alpha[$i3]$alpha[$i2]$alpha[$i1] # 逐一链接,-f表示如存在同名链接则删除再创建,$alpha[$i3]表示获取alpha的索引为i3的字母
@ i1 ++ # i1自增
if ( $i1 > 26 ) then
set i1 = 1 # 如果第一个x已经存在从A到Z共26个字母了,第二个x开始从1自增
@ i2 ++
if ( $i2 > 26 ) then
set i2 = 1 # 如果第二个x已经存在从A到Z共26个字母了,第三个x开始从1自增
@ i3 ++
if ( $i3 > 26 ) then # 如果第三个x已存在了从A到Z了,表示需要链接的气象文件数目超过该脚本能链接的最大数目了,这时候一般可以分段模拟。
echo "RAN OUT OF GRIB FILE SUFFIXES!"
endif
endif
endif
end
# 入参多于1个且第二个不为'.'时的情况
else if ( ${#argv} > 1 ) then
rm -f GRIBFILE.??? >& /dev/null # 删除已存在的链接
foreach f ( $* ) # $*表示所有参数($1 $2 …$n的形式)
if ( $f != "." ) then # 如果没循环到软链接的目标目录(当前目录),则依次链接
ln -sf ${f} GRIBFILE.$alpha[$i3]$alpha[$i2]$alpha[$i1]
@ i1 ++
if ( $i1 > 26 ) then
set i1 = 1 # 如果第一个x已经存在从A到Z共26个字母了,第二个x开始从1自增
@ i2 ++
if ( $i2 > 26 ) then
set i2 = 1 # 如果第二个x已经存在从A到Z共26个字母了,第三个x开始从1自增
@ i3 ++
if ( $i3 > 26 ) then # 如果第三个x已存在了从A到Z了,表示需要链接的气象文件数目超过该脚本能链接的最大数目了,这时候一般可以分段模拟。
echo "RAN OUT OF GRIB FILE SUFFIXES!"
endif
endif
endif
endif
end
else if ( ${#argv} == 0 ) then # 如果未传入参数,则在屏幕上给出用法提示
echo " "
echo " "
echo " Please provide some GRIB data to link"
echo " usage: $0 path_to_grib_data/grib_data_root"
echo " "
echo " "
endif
3 用法总结
根据上面对源码的分析,可以知道最多能链接262626=17576个文件(夹),一般都是足够了的。主要有两种链接方法
3.1 批量链接
输入两个参数,第一个参数为要连接的气象数据的文件夹,第二个参数为链接目的地(当前位置,即’.')。例:
# 假如需要连接的气象数据均在metdata文件夹下,则可使用如下命令
./link_grib.csh /metdata/ .
3.2 文件单个列出后再链接
输入多于两个参数,第一个至倒数第二个参数为要连接的气象数据的文件,最后一个参数为链接目的地(当前位置,即’.')。例:
# 假如需要连接的气象数据均在metdata文件夹下,分别为fileA和fileB,则可使用如下命令
./link_grib.csh /metdata/fileA /metdata/fileB .
“微思研”微信公众号,用于分享个人学习及工作生活趣事。