Utilizzo di Terminal per troncare i nomi di file nella directory

3

Ho circa mille jpeg in una directory con nomi di file come

1300-Kazoo-Pkg.jpg
1314-Learn-to-play-Piano-withKid.jpg
1314-Learn-to-play-piano.jpg

Voglio abbreviarli ai numeri prima del primo trattino.

Ho provato a utilizzare for f in *.jpg; do mv "$f" "${f/-*.}"; done ma non riesco a capire cosa aggiungere per ottenere ciò che voglio.

Qualche suggerimento?

    
posta enano2054 26.09.2015 - 03:46
fonte

1 risposta

4

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
    
risposta data 26.09.2015 - 04:35
fonte

Leggi altre domande sui tag