したがって、入力ディレクトリ、出力ディレクトリ、およびファイルのリストがあります。
#!/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
私がしなければならないのは、入力ファイルと出力ファイルを引数として使用するコマンドを実行することです。私の場合、入力ファイルは出力ファイルディレクトリとは異なるディレクトリにありました。
注:出力ファイルを指定するときは、元のファイル名の末尾と拡張子の間に「cropped」という単語を追加したいと思います。
このループは機能しません:
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
以下は、サンプルファイル名の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
ディレクトリも削除されるため、先にターゲットディレクトリを追加できます。