- 积分
- 4634
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2013-3-20
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本文首发于微信公众号【气象备忘录】,转载请标明出处
当我们运行WPS,处理大批量的数据文件的时候(比如,数年的fnl数据),在运行
- ./link_grib.csh fnl_*grib2
复制代码 时,有时我们会遇到这样的错误:
- foreach: Too many arguments.
复制代码 这是由于csh在大多数linux发行版上的默认实现tcsh的语法中,foreach 函数无法接受过多的参数。一旦参数超过一定数量,就会报foreach: Too many arguments.这种错误。那我们应该如何解决呢?有下列几种方法供大家选择- 减少单次运行WPS时处理文件的数量。少量多次即可避免这一问题。
- 如果我们深入研究一下link_grib.csh这个脚本,那我们可以发现,它做的只不过是将文件软链接到当前目录,然后重命名为GRIBFILE.????格式而已。既然csh的循环有数量限制,那我们将其改写为python不就行了嘛。
下面就是我将csh脚本一比一改写而成的python脚本。只要将原本的./link_grib.csh fnl_*grib2改写成./link_grib.py fnl_*grib2就可以了!最多支持26^4=456976个文件,按照fnl每天4个文件来算的话,相当于300多年。相信够大家用的了。- #! /usr/bin/python
- import sys, glob, os
- def link_grib_file(filelist):
- n = 0
- for ifile in filelist:
- if ifile != ".":
- file_suffix = file_alphabet(n)
- os.symlink(ifile, "GRIBFILE." + file_suffix)
- n += 1
-
- def file_alphabet(number):
- 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']
- if number >= 26 * 26 * 26:
- print("RAN OUT OF GRIB FILE SUFFIXES!")
- exit()
- else:
- i1 = number % 26
- i2 = (number - i1) // 26 % 26
- i3 = (number - i2 * 26 - i1) // 26 // 26 % 26
- return alpha[i3] + alpha[i2] + alpha[i1]
- if __name__ == "__main__":
- varlist = sys.argv[1:]
- if (len(varlist) == 1) or (len(varlist) == 2 and varlist[1] == "."):
- os.system("rm -f GRIBFILE.???")
- filelist = glob.glob(varlist[0])
- link_grib_file(filelist)
- elif len(varlist) > 1:
- os.system("rm -f GRIBFILE.???")
- filelist = varlist
- link_grib_file(filelist)
- elif len(varlist) == 0:
- print(" ")
- print(" ")
- print(" Please provide some GRIB data to link")
- print(" usage: ./link_grib.py path_to_grib_data/grib_data_root")
- print(" ")
- print(" ")
复制代码
|
|