Gostaria de adicionar texto ao final do nome do arquivo, mas antes da extensão. Agora eu estou tentando,
for f in *.shp; do echo $f_poly; done
a saída é,
Quercus_acutifolia.shp_poly
Quercus_agrifolia.shp_poly
Quercus_corrugata.shp_poly
Quercus_cortesii.shp_poly
Quercus_costaricensis.shp_poly
Quercus_havardii.shp_poly
Quercus_hemisphaerica.shp_poly
Quercus_kelloggii.shp_poly
Quercus_knoblochii.shp_poly
Quercus_laceyi.shp_poly
Eu quero que seja
Quercus_acutifolia_poly.shp
Quercus_agrifolia_poly.shp
Quercus_corrugata_poly.shp
Quercus_cortesii_poly.shp
Quercus_costaricensis_poly.shp
Quercus_havardii_poly.shp
Quercus_hemisphaerica_poly.shp
Quercus_kelloggii_poly.shp
Quercus_knoblochii_poly.shp
Quercus_laceyi_poly.shp
printf
com uma string de formato em vez de menos portátilecho
. 2. Uso expansão de parâmetros que é mais eficiente do que chamar um binário externo (basename
) para uma tarefa tão simples.for f in *.shp; do mv $f ${f%.shp}_poly.shp; done
Às vezes, existe uma ferramenta chamada "renomear" instalada.
Pode não ser portátil, mas é fácil de usar.
fonte
Usa isto:
fonte
basename
é mais lento e menos eficiente do que deixar o shell fazer o trabalho sozinho. Isso pode ser perceptível para um número muito grande de arquivos.--
es ausentes e isso falha nos nomes de arquivos que possuem caracteres de nova linha antes de.shp
.Isso funcionou melhor para mim:
for f in *; do NEW=${f%.webm}_2016.webm; mv ${f} "${NEW}"; done
fonte
for f in *.webm
, você esqueceu de citar${f}
e está faltando um--
.echo
), mas não o necessário.Se eles estiverem em locais diferentes, execute: -
fonte
Como a pergunta é para,
bash
não há necessidade de utilitários externos, pois você pode usar o bash regexps :fonte