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 .mp4
archivo y .srt
archivo 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 .mp4
y .srt
específicamente, ya que estos son los que muestra en la pregunta.
Usando un sh
bucle 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 rename
utilidad 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 -n
más invocación a la rename
utilidad para ver primero qué sucedería.
Ver también: