Como renomear arquivos com diferentes extensões

1

Digamos que eu tenha esses arquivos:

essay.aux                   essay.out
essay.dvi                   essay.pdf
essay.fdb_latexmk           essay.tex
essay.fls                   essay.toc
essay.log                   ......

Como posso renomeá-los para:

new_name.aux                new_name.out
new_name.dvi                new_name.pdf
new_name.fdb_latexmk        new_name.tex
new_name.fls                new_name.toc
new_name.log                ......

O problema é que eles têm extensões diferentes em vez de nomes diferentes, por isso não posso usar respostas da pergunta . Além disso, estou no macOS que não tem um comando rename .

    
por nalzok 05.02.2018 / 13:25

4 respostas

3

Aqui está uma solução que consegui trabalhar:

#!/bin/bash
shopt -s nullglob

my_files='/root/temp/files'
old_name='essay'
new_name='new_name'

for file in "${my_files}/${old_name}"*; do
    my_extension="${file##*.}"
    mv "$file" "${my_files}/${new_name}.${my_extension}"
done
  • shopt -s nullglob

Isso evitará um erro se o diretório que está analisando estiver vazio

  • for file in "${my_files}/${old_name}"*; do

Vamos fazer um loop por cada file em /root/temp/files/ , desde que comece com essay

  • my_extension="${file##*.}"

Isso reduzirá tudo ao último . encontrado no nome do arquivo (esperamos que você fique apenas com a extensão)

  • mv "$file" "${my_files}/${new_name}.${my_extension}"

Isso move o arquivo antigo para o novo nome de arquivo enquanto reserva a extensão. (renomear)

    
por 05.02.2018 / 13:36
2

Você também pode usar o find:

 find . -name "essay.*" -exec sh -c 'mv $1 new_name.${1##*.}' rename {} \;
    
por 05.02.2018 / 16:51
1

Eu usei o comando abaixo para obter o resultado

Primeiro eu usei para loop em for loop Eu mencionei todas as extensões de arquivo e, em seguida, em loop eu usei o comando awk para renomear o arquivo conforme os requisitos.

Testado e trabalhado bem

comando

for i in aux out dvi pdf fdb_latexmk tex fls toc; do  find . -type f -iname "*.$i"| awk -F "./" '{print $2}' | awk -F "." '{print "mv" " " $1"."$2 " " "new_name."$2}'| sh; done
    
por 05.02.2018 / 16:28
0

Se você estiver usando o zsh, poderá fazer isso:

autoload zmv
zmv -w 'essay.*' 'new_name.$1'

cortesia de esta resposta .

    
por 05.02.2018 / 13:36