Renomeia um componente específico do nome do arquivo de minúscula para maiúscula

0

Eu tenho um diretório com vários arquivos nomeados como segue:

London_qle_merged
Paris_qle_merged
Tokyo_qle_merged
London_qle_obs
Paris_qle_merged
Tokyo_qle_merged

Como posso renomear o arquivo com * mesclado no nome do arquivo como segue:

London_Qle_merged
Paris_Qle_merged
Tokyo_Qle_merged

Eu sei que eu poderia fazer um loop da seguinte forma:

for name in Paris London Tokyo do;
  mv ${name}_qle_merged ${name}_Qle_merged
done

mas não há outra maneira?

    
por steve 31.01.2018 / 16:39

4 respostas

2

Claro. Em ksh / Bash / zsh:

for f in *_merged; do
    mv -- "$f" "${f/_qle_/_Qle_}" 
done

ou no shell padrão.

for f in *_qle_merged; do
    mv -- "$f" "${f%_qle_merged}_Qle_merged" 
done

Veja também, por ex. Expansão de parâmetros no BashGuide

    
por 31.01.2018 / 16:42
0

Eu fiz isso por combinação de awk e tr

Comando

find . -type f -iname "*merged" |tr -d "./" | awk -F "_" '{print "mv" " " $1"_"$2"_"$3 " " $1"_"toupper(substr($2,1,1))substr($2,2)"_"$3 }' | sh

Abaixo de arquivos mesclados

London_qle_merged
Paris_qle_merged
Tokyo_qle_merged 

renomeado para

London_Qle_merged
Paris_Qle_merged
Tokyo_Qle_merged
    
por 31.01.2018 / 19:52
0

Isso fará o trabalho sem loops de script, gerando apenas um único subprocesso:

rename 's/qle/Qle/' *_merged
    
por 31.01.2018 / 20:09
0

O comando rename é seu amigo aqui. É sed para nomes de arquivos. (verifique se você tem a versão Larry Wall, há pelo menos dois programas com esse nome).

A resposta a seguir é para o conteúdo do arquivo e, portanto, usa sed . Eu usei e refiz para rename . link

rename  -e 's/_(.)/_\u$1/' *_merged

Up casos a carta imediatamente após o primeiro _ .

Uma solução mais simples para essa entrada específica

rename 's/qle/Qle/' *_merged
    
por 31.01.2018 / 20:19

Tags