¿Cómo eliminar una cadena en varios nombres de archivos después de un carácter específico?

¿Cómo eliminar una cadena en varios nombres de archivos después de un carácter específico?

Tengo varios archivos en una carpeta con este formato de nombre.

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

Ahora cómo eliminar la cadena después -para que el nombre del archivo se vea así

01. file one.srt
01. file one.mp4
02. file two.srt
02. file two.mp4
03. file three.srt
03. file three.mp4

Respuesta1

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

Respuesta2

Podrías usar la sustitución de parámetros de bash de esta manera:

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

Respuesta3

Usando un bucle en bash:

for name in *.mp4 *.srt; do
    mv -i -- "$name" "${name/-*./.}"
done

Esto renombra cada .mp4archivo y .srtarchivo reemplazando la parte del nombre entre el primer guión y el último punto por un punto, mediante una sustitución de variables.

Elegí seleccionar los archivos .mp4y .srtespecíficamente, ya que estos son los que muestra en la pregunta.

Usando un shbucle portátil:

for name in *.mp4 *.srt; do
    mv -i -- "$name" "${name%%-*}.${name##*.}"
done

Aquí ${name%%-*}estará el nombre original con todo lo que está después del primer guión cortado y ${name##*.}será el sufijo del nombre de archivo después del último punto del nombre de archivo.


Usando la renameutilidad Perl:

$ 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

La expresión Perl s/-.*\././es una sustitución que se aplicará a cada nombre de archivo determinado, cambiando el nombre del archivo.

Esta sustitución reemplaza la parte del nombre del archivo desde el primer guión hasta el último punto con un punto.

Es posible que desee agregar -nmás invocación a la renameutilidad para ver primero qué sucedería.

Ver también:

información relacionada