bash - 循环更改文件名

bash - 循环更改文件名

所以我有输入目录、输出目录和文件列表:

#!/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还会删除该目录,因此您可以在前面添加目标目录。

相关内容