Я хотел бы выполнить пакетное переименование файлов в определенной папке, удалив часть после последнего -
, следующим образом.
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'