Cambiar el nombre de los archivos por lotes para eliminar la parte después del último "-" ignorando la extensión

Cambiar el nombre de los archivos por lotes para eliminar la parte después del último "-" ignorando la extensión

Me gustaría cambiar el nombre de los archivos por lotes en una carpeta determinada, eliminando la parte después de la última -, de la siguiente manera.

  • hello world - Mr Sheepahello world
  • super user - question on super user.docxasuper user.docx
  • abc - def - ghi jkl.pdfaabc - def.pdf

Preferiría una solución de línea de comandos, pero otras opciones están bien.

Respuesta1

Para eliminar el último -uso ${f% - *}como en bash, ${var%Pattern}se eliminará el patrón más corto al final de la variable. Para más información leaSustitución de parámetros. El resultado es asi

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

Después de verificar que los nuevos nombres de archivos sean correctos, puede eliminarlos echopara realizar el cambio de nombre real. Manifestación:

$ 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'

información relacionada