Eliminar todos los caracteres después de la extensión del archivo

Eliminar todos los caracteres después de la extensión del archivo

Tengo docenas de archivos como:

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

Me gustaría eliminar todo lo que está después de ".mkv"

Intenté buscar algunas expresiones regulares que me ayudarían, pero no entiendo cómo usarlas.

¿Alguien podría ayudarme?

Respuesta1

Nota sobre rename, prenameetc. ver:

En esta respuesta se utiliza la variante de Perl, no la de util-linux. Como en no:

$ rename --version
rename from util-linux 2.31.1

pero:

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

o similar.


Con cambio de nombre en Perl:

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

Utilice la -nopción primero para asegurarse de que haga lo que desea.

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

En breve:

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

es:

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

\.mkv.*coincide con un punto literal, \.luego la cadena mkvy finalmente cualquier carácter (incluido \nel que necesita la sbandera) cero o más veces .*.

El resultado es reemplazar .mkv<anything>con .mkv.


Hay herramientas para ayudar con la lectura y la construcción de expresiones, comohttps://regex101.com/

Respuesta2

en bash:

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

Respuesta3

Conzsh'szmv:

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

Elimina la pieza después de lamás a la derechaaparición de .mkven el nombre del archivo (cambia el nombre foo.mkv-bar.mkv-whatevera foo.mkv-bar.mkv).

Para elmás a la izquierdaocurrencia (para cambiar el nombre de ese archivo foo.mkv), puede reemplazarlo *.mkvcon *.mkv~*.mkv?*el que coincide con una cadena que termina en .mkvpero que tampoco contiene .mkvseguido de al menos un carácter usando ~"excepto"operador global.

Respuesta4

En una fiesta de script

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

información relacionada