異なるファイルで実行するための cdo コマンドの bash スクリプト

異なるファイルで実行するための cdo コマンドの bash スクリプト

私は UNIX 初心者ですが、グリッドを変換するために (投影から地理座標系に) CDO (Climate Data Operator) の "remapbil" コマンドを適用したいと考えています。次のコマンドを使用すると、1 つのファイルに対して完全に正常に動作します。

cdo remapbil,target.grd hurs_EUR-11_ICHEC-EC-EARTH_rcp26_r3i1p1_DMI-HIRHAM5_v1_day_20360101-20401231.nc hurs_36_40_bil.nc

しかし、多くの異なるファイルに対してこれを実行する必要があります。このため、ディレクトリ内のすべてのファイルに対して remapbil コマンドを実行できる次の bash シェルを作成しようとしました。

#!/bin/bash

for i in *.nc;
do
echo $i
for file in "ls *.nc"; do
cdo remapbil,target.grd tas_EUR-11_ICHEC-EC-EARTH_rcp45_r3i1p1_DMI-HIRHAM5_v1_day_20210101-20251231.nc > tas_$i_bil.nc
done
done

しかし、常に次のエラーが発生します。

cdo remapbil (Abort): Too few streams specified! Operator needs 1 input and 1 output streams.

誰か助けてくれるかな、それは素晴らしいことだ

答え1

次のように確認できるように、for file in "ls *.nc"; do . . . ; doneリテラル引数を使用してコマンドを 1 回実行します。ls *.nc

$ ls *.nc
bar.nc  foo.nc
$ for file in "ls *.nc"; do echo "$file" ; done
ls *.nc

おそらくあなたはコマンド置換二重引用符の代わりにバッククォートを使用するしかしそれは良くない考えだ1 は、すでにシェル グロブ (引用符で囲まれていれば安全) を使用してファイルをループしているので不要です。つまり、

for i in *.nc;
do
echo $i
cdo remapbil,target.grd  "$i" > "tas_${i}_bil.nc"
done

出力ファイルの拡張子を削除して置き換えたい場合は、"tas_${i}_bil.nc"次のように変更します。"tas_${i%.nc}_bil.nc"


  1. なぜない解析しますかls?

関連情報