Удалить все символы после расширения файла

Удалить все символы после расширения файла

У меня есть десятки файлов, таких как:

title.mkv]-[72+167] - "" yEnc  637005001 (1+889)

Я хотел бы удалить все после ".mkv"

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

Может ли кто-нибудь мне помочь?

решение1

Примечание по renameи prenameт.д. см.:

В этом ответе используется вариант Perl, а не тот, что в форме util-linux. Например, not:

$ rename --version
rename from util-linux 2.31.1

но:

$ rename --version
/usr/bin/rename using File::Rename version 0.20

или похожие.


С помощью Perl переименовать:

rename 's/\.mkv.*/.mkv/s' ./*.mkv*

Сначала воспользуйтесь -nопцией, чтобы убедиться, что она соответствует вашим требованиям.

rename -n 's/\.mkv.*/.mkv/s' ./*.mkv*

Суммируя:

s/\.mkv.*/.mkv/s

является:

substitute/<THIS>/<WITH THIS>/s

\.mkv.*соответствует точке, \.затем строке mkvи, наконец, любому символу (включая \nтот, для которого вам нужен sфлаг) ноль или более раз .*.

Результат — заменить .mkv<anything>на .mkv.


Существуют инструменты, помогающие читать и строить выражения, например:https://regex101.com/

решение2

в bash:

for f in *; do [[ "$f" =~ ^.+\.mkv ]] && mv "$f" "${BASH_REMATCH[0]}"; done

решение3

Сzsh'szmv:

autoload zmv
zmv -v '(*.mkv)*' '$1'

Удаляет часть послесамый правыйвхождение .mkvв имени файла (переименовывает foo.mkv-bar.mkv-whateverв foo.mkv-bar.mkv).

Длясамый левыйвхождение (чтобы переименовать этот файл в foo.mkvвместо этого), вы можете заменить *.mkvна *.mkv~*.mkv?*, которое соответствует строке, заканчивающейся на , .mkvно которая также не содержит , .mkvза которым следует по крайней мере один символ, используя ~«кроме»оператор глоб.

решение4

В скрипте bash

#!/bin/bash
for i in *.mkv*
do
  j=$(echo "$i" | sed -e 's/\.mkv.*$/.mkv/')
  mv -- "$i" "$j"
done

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