Удалить часть имени после регулярного выражения

Удалить часть имени после регулярного выражения

У меня есть несколько видеофайлов, использующих такую ​​схему именования:

некоторые-слова-SxxExx.расширение

что мне больше нравится. К сожалению, у меня много файлов в этом формате

некоторые-слова-SxxExx-слова-Я-хочу-удалить.расширение

Мне нужно автоматически удалить все после части Exx.

решение1

Предполагая, что x' являются заполнителями, zmvэто можно сделать с помощью zmv -nv '(*S??E??)*.ext' '$1.ext'

% touch foo-S01E02-garbage.ext bar-S07E17-moregarbage.ext
% zmv -nv '(*S??E??)*.ext' '$1.ext'
mv -- bar-S07E17-moregarbage.ext bar-S07E17.ext
mv -- foo-S01E02-garbage.ext foo-S01E02.ext

Вы также можете использовать '(*S[0-9][0-9]E[0-9][0-9])*.ext'для сопоставления цифр вместо x.

Или если вы хотите использовать sed:

for f in *.ext; do
    echo mv -n "$f" "$(echo "$f" | sed -e 's/\(S[0-9][0-9]E[0-9][0-9]\).*\.ext/\1.ext/')"
done

или с помощью команды Perl rename(которая, по-видимому, теперь называется file-renameв Debian):

file-rename -n -v 's/(S[0-9]{2}E[0-9]{2}).*\.ext/$1.ext/' *.ext

(Удалите echofrom перед mvи -nфлаги из zmvи , file-renameчтобы фактически выполнить переименование. mv -nС другой стороны, это говорит ему не перезаписывать существующие файлы, это работает, по крайней мере, в GNU mv.)

решение2

Как насчет

$ echo 'some-words-SxxExx-words-I-want-to-remove.extension' | sed 's/\(S..E..\)[^.]*/\1/'
some-words-SxxExx.extension

(хотя я ожидаю, что поклонник zsh сможет сделать это проще, используя подстановку оболочки).

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