Como acessar o final do nome do arquivo (antes da extensão) em um loop

0

Eu tenho uma pasta com nomes de arquivos terminando com .TIF , e fiz um loop for

for i in *.TIF

No loop, eu quero pegar dois tipos de arquivos terminando por exemplo (B4.TIF e B5.TIF.

Eu fiz assim, mas ele não pega as últimas quatro letras do nome do arquivo, mas adiciona-as no final.

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

Meus resultados desejados são obter esses nomes de arquivos para fazer alguns cálculos

estes são os exemplos dos arquivos na pasta

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

e este é o script que estou usando para fazer os cálculos

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

O resultado final será subtrair o B4 e B5. então esse ${i}_B4_SA.TIF -B ${i}_B5_SA.TIF deve pegar os dois nomes de arquivos assim:

LC08_L1TP_195020_20170224_20170301_01_T1_B4.TIF - 
LC08_L1TP_195020_20170224_20170301_01_T1_B5.TIF
    
por MKJ 14.11.2018 / 11:16

3 respostas

1

Faça um loop sobre os arquivos que constituem uma metade dos pares e, para cada arquivo, construa o nome do arquivo do par correspondente e do arquivo de saída:

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
    
por 14.11.2018 / 11:41
0

A primeira nota é que não existe uma extensão de arquivo no Unix. . é apenas outro caractere. Então, aqui eu procuro por alguns dos seus arquivos, retire o final do nome, pronto para colocá-lo de volta (de duas maneiras diferentes).

Isso vai funcionar, mas pode ter alguns bugs latentes.

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

Isso deve ser mais robusto

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

Por favor, teste, como eu não tenho (pode haver algum pequeno erro). E não há verificação de erros. Seu programa deve verificar a falta de correspondências.

    
por 14.11.2018 / 11:39
0

Como você está usando o Bash, você pode usar Expansão de parâmetro cortar o final e salvar a parte comum do nome do arquivo em uma nova variável:

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
    
por 14.11.2018 / 11:47

Tags