Per preservare l'estensione del nome file nel modo previsto, dovresti farlo invece:
for f in *.jpg; do mv "$f" "${f/-*}.jpg"; done
Cioè, usa ${f/-*}.jpg
invece di ${f/-*.}
.
Per gestire il caso di più file che hanno lo stesso prefisso prima del trattino, puoi fare qualcosa di simile: [ Nota: per una versione migliore, vedi Aggiornamento Da allora ho aggiunto.]
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
Questo ti darà un risultato come questo:
1300.jpg
1314-0.jpg
1314-1.jpg
1315-2.jpg
1315-3.jpg
Vale a dire, verrà aggiunto un suffisso -N
, con la limitazione che questo semplice esempio continua semplicemente ad incrementare il valore N
sull'intero insieme di file invece del prefisso per-prefisso.
Nota inoltre che puoi tranquillamente eseguire nuovamente questo script più volte nella stessa directory e alla fine ti ritroverai con gli stessi nomi di file previsti (che penso sia ciò che vorresti, piuttosto che monkeying in giro inoltre con qualsiasi nome di file già presente nel modulo desiderato).
Aggiornamento
Ecco una versione migliore che aggiunge i suffissi 1- N ai file rinominati se trova un file esistente con lo stesso nome di base o lo stesso nome di base + N (nel qual caso aumenta di N +1 e riprova).
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
Questo dà un output come questo:
1300.jpg
1314-1.jpg
1314.jpg
1315-1.jpg
1315-2.jpg
1315.jpg