bash-скрипт для команды cdo, чтобы запустить ее для разных файлов

bash-скрипт для команды cdo, чтобы запустить ее для разных файлов

Я новичок в UNIX и хочу применить команду CDO (Climate Data Operator) "remapbil" для преобразования сетки (из проекции в географическую систему координат). Это прекрасно работает для одного файла с помощью следующей команды:

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

Но мне нужно сделать это для множества разных файлов. По этой причине я попытался написать следующую оболочку bash, которая позволит мне запустить команду remapbil для всех файлов в моем каталоге:

#!/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будет выполнена один раз с буквальным аргументом ls *.nc, в чем вы можете убедиться следующим образом:

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

Вы, вероятно, намеревалисьзамена командыиспользование обратных кавычек вместо двойныхно это была бы плохая идея1 и не является необходимым, так как вы уже циклически проходите по файлам, используя (безопасный, если заключен в кавычки) shell glob. Итак:

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?

Связанный контент