dynamisches Rename

(Lutz Donnerhacke) lutz at iks-jena.de
Fre Mai 21 11:20:50 CEST 1999


* Erik Heinz wrote:
>On Thu, May 20, 1999 at 09:01:01PM +0200, Viscid --- wrote:
>> Rein technische Frage...gibt es auf Linux ein Programm mit dem ich
>> dynamische Filenamer erzeugen kann...z.b. Rename *.* filebla???

man mmv. (speziell SuSE)
BTW: Pratchett.

>> soll alle Files in
>> der aktuellen directory nach filebla000...filebla001...filebla002 etc.
>> umbenennen...
>
>Simple Übung in Shellprogrammierung oder Perl. Mit der Shell geht's so:
>
>N=0
>for FILE in * ; do
>  mv -v $FILE filebla$(printf "%03u", $N)
>  N=$(($N + 1))
>done

Naja... nicht ganz:

N=0
for FILE in *; do
  if ! expr "$FILE" : "filebla[0-9]\{3,\}" > /dev/null; then
    while [ -e "filebla$(printf "%03u" $N)" ]; do
      N=$[$N+1]
    done
    mv "$FILE" "filebla$(printf "%03u" $N)"
  fi
done

Leider enthält das eine Racecondition, d.h. es kann zu Datenverlust kommen,
wenn nach dem Test auf Nichtexistenz eine Datei angelegt wird. Es fehlt eine
Option bei mv(1), die bei Existenz des Zieles abbricht. Gäbe es diese, so
lautete das Programm ohne Racecondition:

N=0
for FILE in *; do
  if ! expr "$FILE" : "filebla[0-9]\{3,\}" > /dev/null; then
    while ! mv --dont-overwrite "$FILE" "filebla$(printf "%03u" $N)"; do
      N=$[$N+1]
    done
  fi
done