Пакетное переименование имен файлов с удалением части после последнего "-", игнорируя расширение

Пакетное переименование имен файлов с удалением части после последнего "-", игнорируя расширение

Я хотел бы выполнить пакетное переименование файлов в определенной папке, удалив часть после последнего -, следующим образом.

  • hello world - Mr Sheepкhello world
  • super user - question on super user.docxкsuper user.docx
  • abc - def - ghi jkl.pdfкabc - def.pdf

Я бы предпочел решение с помощью командной строки, но и другие варианты тоже приемлемы.

решение1

Чтобы удалить последнее -используйте ${f% - *}как в bash${var%Pattern} будет удален самый короткий шаблон в конце переменной. Для получения дополнительной информации читайтеПодстановка параметров. Результат такой

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

После проверки правильности новых имен файлов вы можете удалить их, echoчтобы выполнить настоящее переименование. Демонстрация:

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

Связанный контент