Remova todos os caracteres após a extensão do arquivo

Remova todos os caracteres após a extensão do arquivo

Eu tenho dezenas de arquivos como:

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

Eu gostaria de remover tudo depois de ".mkv"

Tentei procurar algumas regex que me ajudassem, mas não entendo como usá-las.

Alguém poderia me ajudar?

Responder1

Nota sobre rename, prenameetc. veja:

Nesta resposta, a variante Perl é usada, não a única forma util-linux. Como não:

$ rename --version
rename from util-linux 2.31.1

mas:

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

ou similar.


Com Perl renomear:

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

Use a -nopção primeiro para ter certeza de que ela faz o que você deseja.

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

Resumidamente:

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

é:

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

\.mkv.*corresponde a um ponto literal, \.depois à string mkve, finalmente, a qualquer caractere (inclusive \npara o qual você precisa do ssinalizador) zero ou mais vezes .*.

O resultado é substituir .mkv<anything>por .mkv.


Existem ferramentas para ajudar na leitura e na construção de expressões, comohttps://regex101.com/

Responder2

em bash:

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

Responder3

Comzshdezmv:

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

Remove a peça após omais à direitaocorrência de .mkvno nome do arquivo (renomeia foo.mkv-bar.mkv-whateverpara foo.mkv-bar.mkv).

Para omais à esquerdaocorrência (para renomear esse arquivo foo.mkv), você pode substituir *.mkvpor *.mkv~*.mkv?*qual corresponde a uma string que termina em, .mkvmas que também não contém .mkvseguido por pelo menos um caractere usando o ~"exceto"operador global.

Responder4

Em uma festa de script

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

informação relacionada