루프에서 파일 이름 끝(확장자 전)에 액세스하는 방법

루프에서 파일 이름 끝(확장자 전)에 액세스하는 방법

파일 이름이 다음으로 끝나는 폴더가 있고 .TIFfor 루프를 만들었습니다.

for i in *.TIF

루프에서 두 가지 유형의 파일 끝(예: B4.TIF 및 B5.TIF)을 얻고 싶습니다.

그러나 나는 파일 이름의 마지막 네 글자를 가져오는 대신 끝에 추가했습니다.

do ...... ${i}_B4.TIF -B ${i}_B5.TIF

내가 원하는 결과는 일부 계산을 수행하기 위해 이러한 파일 이름을 얻는 것입니다.

다음은 폴더에 있는 파일의 예입니다.

LC08_L1TP_195020_20170224_20170301_01_T1_B4.TIF  
LC08_L1TP_195020_20171107_20171121_01_T1_B4.TIF

LC08_L1TP_195020_20170224_20170301_01_T1_B5.TIF  
LC08_L1TP_195020_20171107_20171121_01_T1_B5.TIF

이것은 계산을 수행하는 데 사용하는 스크립트입니다.

for i in *.TIF   
do 
    gdal_calc.py -A ${i}_B4_SA.TIF -B ${i}_B5_SA.TIF --type=Float32
--outfile=~/Geodata/goteborg/croped/ndvi/${i}_NDVI.TIF --calc="(B-A)/(B+A)"

done

최종 출력은 마이너스 B4 및 B5가 됩니다. 따라서 ${i}_B4_SA.TIF -B ${i}_B5_SA.TIF다음과 같은 두 개의 파일 이름이 생성됩니다.

LC08_L1TP_195020_20170224_20170301_01_T1_B4.TIF - 
LC08_L1TP_195020_20170224_20170301_01_T1_B5.TIF

답변1

쌍의 절반을 구성하는 파일을 반복하고 각 파일에 대해 해당 쌍과 출력 파일의 파일 이름을 구성합니다.

for b4_file in ./*_B4.TIF; do
    b5_file="${b4_file%_B4.TIF}_B5.TIF"
    ndvi_file="$HOME/Geodata/goteborg/croped/ndvi/${b4_file%_B4.TIF}_NDVI.TIF"

    if [ ! -f "$b5_file" ]; then
        printf 'Expected to find "%s" to go with "%s", but did not\n' "$b5_file" "$b4_file" >&2
        continue
    fi

    # do whatever it is you need to do with "$b4_file" and "$b5_file"

    gdal_calc.py -A "$b4_file" -B "$b5_file" --type=Float32 \
        --outfile="$ndvi_file --calc="(B-A)/(B+A)"

done

답변2

먼저 Unix에는 파일 확장자와 같은 것이 없다는 점에 유의하십시오. .또 다른 캐릭터입니다. 그래서 여기서는 파일의 약 1/2을 검색하여 이름 끝 부분을 제거하고 (두 가지 다른 방법으로) 다시 넣을 준비를 하고 있습니다.

이렇게 하면 작동하지만 잠재적인 버그가 있을 수 있습니다.

for f in *_B5.TIF   
do 
    i="$(echo "$f" | sed -r -e 's/(.*)_B5.TIF/\1/')"
    … ${i}_B4_SA.TIF -B ${i}_B5_SA.TIF …
done

이건 좀 더 튼튼해야 해

find . -iname "*_B5.TIF" -print0 | sed -0r -e 's/(.*)_B5.TIF/\1/' | xargs -0 -i … {}_B4_SA.TIF -B {}_B5_SA.TIF …

제가 가지고 있지 않으니 테스트해 보세요(사소한 버그일 수도 있습니다). 그리고 오류 검사도 없습니다. 프로그램은 잘못된 일치를 확인해야 합니다.

답변3

Bash를 사용할 때 다음을 사용할 수 있습니다.매개변수 확장끝 부분을 자르고 파일 이름의 공통 부분을 새 변수에 저장합니다.

for f in *_B4.TIF ; do
    i="${f%_B4.TIF}"
    gdal_calc.py -A "${i}_B4.TIF" -B "${i}_B5.TIF" --outfile=".../${i}_NDVI.TIF"
done

관련 정보