У меня в папке есть несколько файлов с таким форматом имени
01. file one-sdvanv-12lknl.srt
01. file one-sdvanv-12lknl.mp4
02. file two-afdsmakl-asdfafdaf.srt
02. file two-afdsmakl-asdfafdaf.mp4
03. file three-adfadaasd-asdfadfafad-adad1d1das.srt
03. file three-adfadaasd-asdfadfafad-adad1d1das.mp4
Теперь как удалить строку после, -
чтобы имя файла выглядело так
01. file one.srt
01. file one.mp4
02. file two.srt
02. file two.mp4
03. file three.srt
03. file three.mp4
решение1
for file in *; do
ext=.${file##*.} #Gets file extension
[ "$ext" = ".$file" ] && ext="" #If file had no extension, set it to empty string
nostr=${file%%-*} #Remove everything after -
mv "$file" "$nostr$ext"
done
решение2
Вы можете использовать замену параметров bash следующим образом:
for i in *; do
# ${i%%-*} get everything before the first '-' (use ${i%-*} for the last '-')
# ${i/.*} remove everything after the '.'
# ${i##${i%.*}} remove everything except everything after the last '.'
mv "${i}" "${i%%-*}${i##${i%.*}}"
done
решение3
Использование цикла в bash
:
for name in *.mp4 *.srt; do
mv -i -- "$name" "${name/-*./.}"
done
Это переименовывает каждый .mp4
файл и .srt
файл, заменяя часть имени между первым тире и последней точкой на точку с помощью подстановки переменных.
Я решил выделить именно файлы .mp4
и .srt
, поскольку именно их вы указали в вопросе.
Использование переносной sh
петли:
for name in *.mp4 *.srt; do
mv -i -- "$name" "${name%%-*}.${name##*.}"
done
Здесь ${name%%-*}
будет исходное имя, в котором будет обрезано все после первого тире, а ${name##*.}
будет суффикс имени файла после последней точки в имени файла.
Использование утилиты Perl rename
:
$ tree
.
|-- 01. file one-sdvanv-12lknl.mp4
|-- 01. file one-sdvanv-12lknl.srt
|-- 02. file two-afdsmakl-asdfafdaf.mp4
|-- 02. file two-afdsmakl-asdfafdaf.srt
|-- 03. file three-adfadaasd-asdfadfafad-adad1d1das.mp4
`-- 03. file three-adfadaasd-asdfadfafad-adad1d1das.srt
0 directory, 6 files
$ rename 's/-.*\././' -- *.mp4 *.srt
$ tree
.
|-- 01. file one.mp4
|-- 01. file one.srt
|-- 02. file two.mp4
|-- 02. file two.srt
|-- 03. file three.mp4
`-- 03. file three.srt
0 directory, 6 files
Выражение Perl s/-.*\././
представляет собой замену, которая будет применена к каждому указанному имени файла, переименовывая файл.
Эта подстановка заменяет часть имени файла от первого тире до последней точки на точку.
Возможно, вы захотите добавить -n
вызов утилиты, rename
чтобы сначала посмотреть, что произойдет.
Смотрите также: