Shell-Skript zum Durchnummerieren von Dateien

Hallo zusammen,

ich haben hier einen Haufen (ca. 300) JPG-Dateien, die ich nach dem Muster
0001.JPG; 0002.JPG; … umbenennen möchte. Dazu habe ich mir ein Shell-Skript geschrieben, dessen Code ich unten anfüge.

Beim Durchlauf bekomme ich bei zwei Dateien die Fehlermeldung

mv: Aufruf von stat für "IMG\_7612.JPG" nicht möglich: Datei oder Verzeichnis nicht gefunden

(der Dateiname ist natürlich beim 2. Mal ein anderer)

Außerdem fällt nach dem Durchlauf auf, dass die Dateien 0010.JPG und 0100.JPG fehlen. Offensichtlich klappt der Übergang zwischen den beiden if-Schleifen nicht.

Wo liegt mein Fehler? Hat jemand eine andere/bessere Möglichkeit zum Umbenennen der Dateien?

Danke und Gruß,
Vladimir


Code:

#! /bin/sh
# Umbennen von JPG-Dateien in 0001.JPG, 0002.JPG, ...

z=1

for i in \*.JPG; do
 if test $z -lt 10; then
 mv $i 000$z.JPG 
 z=$[$z+1]
 fi
 
 if test $z -ge 10 -a $z -lt 100; then
 mv $i 00$z.JPG
 z=$[$z+1]
 fi

 if test $z -ge 100 -a $z -lt 1000; then
 mv $i 0$z.JPG
 z=$[$z+1]
 fi

 if test $z -ge 1000 -a $z -lt 10000; then
 mv $i $z.JPG
 z=$[$z+1]
 fi

 if test $z -ge 10000; then
 echo "Mehr als 10 000 Dateien - das kann ich nicht!"
 fi
done

Hallo Vladimir,
ehrlich gesagt bin ich zu faul am Sonntag so ein langes Skript durchzusehen :wink:
Deshalb habe ich schnell ein kleineres geschrieben, das zumindest bei mir seinen Zweck erfüllt:

#!/bin/bash
x=1
for fname in \*.jpg
do
 mv $fname `printf "%05d.jpg" $x`
 x=$(($x+1))
done

mv kannst Du ja beim Testen erstmal durch cp ersetzen (habe ich auch getan). Das %05d gibt an, wieviel Ziffern Du haben möchtest, in dem Fall also 5.
Für printf "%05d.jpg" $x gibt es glaube ich inzwischen eine bessere Form, die fällt mir aber gerade nicht ein. Es ist also noch genug Spielraum für Verbesserungen.

Viele Grüße
Marvin

Hi,

Hat jemand eine andere/bessere
Möglichkeit zum Umbenennen der Dateien?

besser? anders!
>krename

Funktioniert. Danke! (kT)

Danke …
… für den Hinweis.

andere Variante als Direkteingabe:

 ls -1 | perl -lpe '-F && /\.jpg$/ && rename $\_,sprintf("%05d.jpg",$.)'

Grüße

CMБ

(geht schöner, ohne ls)

andere Variante als Direkteingabe:

ls -1 | perl -lpe ‚-F && /.jpg$/ && rename $_,sprintf("%05d.jpg",$.)‘

nicht kürzer, aber schöner:

 perl -e 'rename $ARGV[$\_],sprintf("%05d.jpg",$\_+1) for 0..$#ARGV' \*.jpg

nicht schöner, aber kürzer:

 perl -e '$i=1; rename $\_,sprintf("%05.jpg",$i++) for @ARGV' \*.jpg

Grüße

CMБ