← Back to team overview

sslug-teknik team mailing list archive

Re: Lille udfordring med rename.

 

On 17 Jul 2002, Ole Tranberg wrote:

> Nu ville jeg så gerne ændre navnet på alle billederne.
>
> Fx vil jeg gerne ændre
>   cd1_004_02.jpg
> til
>   cd1_004.jpg.
>
> Dvs. jeg vil gerne fjerne de tegnene fra den anden "_" til lige inden
> ".". Det kan være 1,2 eller tre tegn.

Okay... Jeg kunne ikke lade være med at lege lidt med grep også...
Følgende lille script burde kunne opfylde dit umiddelbare behov. Jeg har
forudsat at der kun er numre der er interessante at skifte ud. Hvis der er
andre tegn, så kan man erstatte det sindssyge "ls | grep <udtryk>" med et
mere normalt "*_*_*.*" istedet.

#!/bin/bash
#
# Rename filer i et katalog
# Hvis det nye filnavn allerede findes indsættes en tæller i
# filnavnet der vil komme til at hedde *_*.x.* hvor x bliver talt
# op fra 1 indtil et ledigt filnavn findes.
#
for file in `ls | grep -E \
"[[:alnum:]]{1,}_[[:digit:]]{1,}_[[:digit:]]{1,3}[\.][[:alnum:]]{1,}"`\
; do
  if [ -f "${file}" ]; then
    extension="${file##*.}"
    basename="${file%.${extension}}"
    basename="${basename%_*}"
    counter=0;
    newname="${basename}.${extension}"
    if [ "${newname}" = "${file}" ]; then
      # nyt og gammelt filnavn er det samme.
      continue
    fi
    while [ -f "${newname}" -a "${newname}" != "${file}" ]; do
      # Tæl op til et ledigt filnavn findes.
      counter=$(( $counter + 1 ))
      newname="${basename}.${counter}.${extension}"
    done
    # Forsøg at rename filen
    mv "${file}" "${newname}" || continue
    echo "${file} -> ${newname}"
  fi
done

>
> Hvordan gøres det lettest? Jeg har kigget lidt på rename, men jeg er
> tydeligvis gået i stå.
>

Jeg er absolut IKKE overbevist om at dette er den letteste måde.


Med venlig hilsen
Bjørn Bille Højte
bjoern@xxxxxxxxxxxxx




References