Renomeação em lote de nomes de arquivos para remover a parte após o último "-" ignorando a extensão

Renomeação em lote de nomes de arquivos para remover a parte após o último "-" ignorando a extensão

Gostaria de renomear arquivos em lote em uma determinada pasta, removendo a parte após a última -, da seguinte maneira.

  • hello world - Mr Sheepparahello world
  • super user - question on super user.docxparasuper user.docx
  • abc - def - ghi jkl.pdfparaabc - def.pdf

Eu preferiria uma solução de linha de comando, mas outras opções estão OK.

Responder1

Remover o último -uso ${f% - *}como no bash ${var%Pattern}removerá o padrão mais curto no final da variável. Para mais informações leiaSubstituição de parâmetros. O resultado é assim

for f in path/*
do
    if [[ $f = *.* ]]; then ext=".${f##*.}"; else ext=""; fi
    echo mv "$f" "${f% - *}$ext"
done

Depois de verificar se os novos nomes dos arquivos estão corretos, você pode removê-los echopara fazer a renomeação real. Demonstração:

$ for f in "hello world - Mr Sheep" "super user - question on super user.docx" "abc - def - ghi jkl.pdf"; do if [[ $f = *.* ]]; then ext=".${f##*.}"; else ext=""; fi; echo mv "'$f'" "'${f% - *}$ext'";  done
mv 'hello world - Mr Sheep' 'hello world'
mv 'super user - question on super user.docx' 'super user.docx'
mv 'abc - def - ghi jkl.pdf' 'abc - def.pdf'

informação relacionada