bash - muda o nome do arquivo em um loop

0

Então eu tenho meu diretório de entrada, diretório de saída e lista de arquivos:

#!/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*')

em que a variável "files" contém o seguinte:

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

O que eu preciso fazer é executar um comando que requer como argumentos um arquivo de entrada e um arquivo de saída. No meu caso, o diretório onde os arquivos de entrada estão localizados é diferente do diretório dos arquivos de saída.

A ressalva é: ao especificar o arquivo de saída, eu gostaria de acrescentar a palavra "croppped" entre o final do nome do arquivo original e a extensão.

Esse loop não funciona:

for f in ${files[@]}; do ## loop over files

echo cdo sellonlatbox "${dir_in}"${f##*/} "${dir_out}"$(printf '%s\n' "${f##*/.nc}_cropped.nc")

done

Idealmente, o resultado seria:

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

Onde está o meu erro aqui?

    
por thiagoveloso 06.05.2015 / 11:04

2 respostas

1

Aqui está um exemplo usando um dos seus nomes de arquivo de amostra (mas trabalhando em extensões de arquivo arbitrárias):

originalfilename=rh.cru_ts3.22.1901.2013.nc

tmpfn=${originalfilename%.*}
extfn=${originalfilename##*.}
newfilename=${tmpfn}_cropped.${extfn}

printf "%s\n" "${originalfilename}" "${newfilename}"

Saída:

rh.cru_ts3.22.1901.2013.nc
rh.cru_ts3.22.1901.2013_cropped.nc
    
por 06.05.2015 / 11:42
0

Você pode usar basename para remover a extensão e adicionar a nova extensão:

 croppedname=$(basename $originalname .nc)_cropped.nc

basename também remove o diretório, para que você possa prefixar seu diretório de destino.

    
por 06.05.2015 / 11:10