Para conservar la extensión del nombre de archivo de la forma esperada, debes hacer esto:
for f in *.jpg; do mv "$f" "${f/-*}.jpg"; done
Es decir, usa ${f/-*}.jpg
en lugar de ${f/-*.}
.
Para tratar el caso de varios archivos que tienen el mismo prefijo antes del guión, puede hacer algo como esto: [ Nota: Para obtener una versión mejor, consulte Actualizar desde entonces he agregado.
i=0
for f in *.jpg; do
if [ "$(ls -l ${f/-*}* | wc -l | xargs)" -gt 1 ]; then
for g in "${f/-*}"; do
mv "$f" "$g-$((i++)).jpg"
done
else
if [[ $f == *"-"* ]]; then
mv "$f" "${f/-*}.jpg"
fi
fi
done
Eso te dará una salida como esta:
1300.jpg
1314-0.jpg
1314-1.jpg
1315-2.jpg
1315-3.jpg
Es decir, se agregará un sufijo -N
, aunque con la limitación de que este ejemplo simple continúa incrementando el valor de N
en todo el conjunto de archivos en lugar de por prefijo.
También tenga en cuenta que puede volver a ejecutar esta secuencia de comandos varias veces en el mismo directorio y terminará con los mismos nombres de archivo esperados al final (que creo que es lo que usted desearía, en lugar de hacerlo de forma monótona) además con cualquier nombre de archivo que ya esté en la forma que desea).
Actualizar
Aquí hay una versión mejor que simplemente agrega los sufijos 1 N a los archivos renombrados si encuentra un archivo existente con el mismo nombre base o el mismo nombre base + N (en cuyo caso se incrementa en N +1 y reintenta).
for f in *.jpg; do
base=${f/-*}
if [[ -e "${base}.jpg" ]] ; then
i=1
while [[ -e "${base}-${i}.jpg" ]]; do
let i++
done
base=$base-$i
fi
mv "$f" "${base}.jpg"
done
Eso da una salida como esta:
1300.jpg
1314-1.jpg
1314.jpg
1315-1.jpg
1315-2.jpg
1315.jpg