![루프에서 파일 이름 끝(확장자 전)에 액세스하는 방법](https://linux55.com/image/142099/%EB%A3%A8%ED%94%84%EC%97%90%EC%84%9C%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%20%EB%81%9D(%ED%99%95%EC%9E%A5%EC%9E%90%20%EC%A0%84)%EC%97%90%20%EC%95%A1%EC%84%B8%EC%8A%A4%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
파일 이름이 다음으로 끝나는 폴더가 있고 .TIF
for 루프를 만들었습니다.
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