저는 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
명령은 리터럴 매개변수를 사용하여 한 번 실행 됩니다 ls *.nc
. 다음과 같이 확인할 수 있습니다.
$ ls *.nc
bar.nc foo.nc
$ for file in "ls *.nc"; do echo "$file" ; done
ls *.nc
당신은 아마도명령 대체큰따옴표 대신 백틱을 사용하세요.하지만 이건 나쁜 생각이야1 이며 파일을 반복하기 위해 이미 (인용된 경우 안전한) 쉘 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"