所以我有输入目录、输出目录和文件列表:
#!/bin/bash ## shell type
dir_in=('/Users/dossa013/data/inland-data/input/')
dir_out=('/Volumes/Macintosh HD 2/data/cmip5/cru/')
files=('/Users/dossa013/data/inland-data/input/*ts*')
其中变量“files”包含以下内容:
cld.cru_ts3.22.1901.2013.nc
prec.cru_ts3.22.1901.2013.nc
rh.cru_ts3.22.1901.2013.nc
temp.cru_ts3.22.1901.2013.nc
trange.cru_ts3.22.1901.2013.nc
wetd.cru_ts3.22.1901.2013.nc
我需要做的是运行一个命令,该命令需要输入文件和输出文件作为参数。就我而言,输入文件所在的目录与输出文件目录不同。
需要注意的是:在指定输出文件时,我想在原始文件名末尾和扩展名之间附加“croppped”一词。
这个循环不起作用:
for f in ${files[@]}; do ## loop over files
echo cdo sellonlatbox "${dir_in}"${f##*/} "${dir_out}"$(printf '%s\n' "${f##*/.nc}_cropped.nc")
done
理想情况下,结果将是:
cdo sellonlatbox /Users/dossa013/data/inland-data/input/prec.cru_ts3.22.1901.2013.nc /Volumes/Macintosh HD 2/data/cmip5/cru/prec.cru_ts3.22.1901.2013_cropped.nc
我的错误在哪里?
答案1
以下是使用示例文件名之一的示例(但适用于任意文件扩展名):
originalfilename=rh.cru_ts3.22.1901.2013.nc
tmpfn=${originalfilename%.*}
extfn=${originalfilename##*.}
newfilename=${tmpfn}_cropped.${extfn}
printf "%s\n" "${originalfilename}" "${newfilename}"
输出:
rh.cru_ts3.22.1901.2013.nc
rh.cru_ts3.22.1901.2013_cropped.nc
答案2
您可以使用basename
删除扩展,然后添加新扩展:
croppedname=$(basename $originalname .nc)_cropped.nc
basename
还会删除该目录,因此您可以在前面添加目标目录。