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

私がしなければならないのは、入力ファイルと出力ファイルを引数として使用するコマンドを実行することです。私の場合、入力ファイルは出力ファイルディレクトリとは異なるディレクトリにありました。

注:出力ファイルを指定するときは、元のファイル名の末尾と拡張子の間に「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ディレクトリも削除されるため、先にターゲットディレクトリを追加できます。

関連情報