Para preservar la extensión del nombre del archivo de la manera esperada, debe hacer lo siguiente:
for f in *.jpg; do mv "$f" "${f/-*}.jpg"; done
Es decir, utilizar ${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 así: [ Nota: Para una mejor versión, consulte el Actualización He añadido después de esto].
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 le dará una salida como esta:
1300.jpg
1314-0.jpg
1314-1.jpg
1315-2.jpg
1315-3.jpg
Es decir, un -N
se añadirá, aunque con la limitación de que este sencillo ejemplo sólo incrementa el N
en todo el conjunto de archivos en lugar de por prefijo.
También tenga en cuenta que puede volver a ejecutar con seguridad este script varias veces en el mismo directorio y terminará con los mismos nombres de archivo esperados al final (que creo que es lo que querría, en lugar de que siga jugando con los nombres de archivo que ya están en la forma que desea).
Actualización
Aquí hay una versión mejor que sólo agrega 1- N a los archivos renombrados si encuentra un archivo existente con el mismo nombre base o con el mismo nombre base+. N (en cuyo caso se incrementa en N +1 y reintentos).
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