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

다음은 예제 파일 이름 중 하나를 사용한 예입니다(단, 모든 파일 확장자와 함께 작동함).

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디렉터리도 제거되므로 앞에 대상 디렉터리를 추가할 수 있습니다.

관련 정보