
Eu tenho vários arquivos que devem ser renomeados programaticamente para serem compreensíveis pelo aplicativo.
Preciso cortar do final até o primeiro _ e substituir por um ponto(.).
Como não sei antecipadamente o comprimento do nome do arquivo nem os números de _ no nome do arquivo, você tem alguma ideia sobre awk/sed/cut ?
Responder1
for F in *_*; do echo mv -- "${F}" "${F%_*}.${F##*_}"; done
Se a saída parecer correta, remova o echo
comando acima.
O truque é ${F%_*}
remover por último _26
e ${F##*_}
remover tudo antes do último _
. Experimente estes comandos para ver como funciona. O delimitador agora é :
:
echo "${PATH}"
echo "${PATH%:*}"
echo "${PATH##*:}"
echo "${PATH%:*}_${PATH##*:}"
Responder2
Usandosed
for file in *_*
do
echo mv $file $( sed 's/\(.*\)_/\1\./' <<< $file)
done
Remova o echo
se estiver satisfeito.
Responder3
Você pode substituir o último bloco por sed
, usando o marcador de fim de linha ( $
).
#/bin/bash
for file in *_* ; do
#any alphanumeric string as suffix
mv $file $( sed 's/_\([A-Za-z0-9]\{1,\}\)$/.\1/' <<< $file )
#alternatively numbers only as in given input sample
mv $file $( sed 's/_\([0-9]\{1,\}\)$/.\1/' <<< $file )
done
AFAIK, o \{1,\}
bit como "um ou mais" da lista anterior é GNU sed
- mas não tenho 100% de certeza dessa restrição.