Shell: Dateinamen aufsteigend ändern

Hallihallo!

Ich bin ziemlich schlecht, was Shellbefehle anbelangt, vielleicht kann
mir jemand von euch helfen.

Ich habe zwei Ordner mit Bilddateien.
Im ersten Ordner sind die Dateien mit Namen 00001.jpg, 00002.jpg,
00003.jpg, usw. bis 30000.jpg.
Im zweiten Ordner sind die Dateien genauso mit Namen 00001.jpg,
00002.jpg, 00003.jpg, usw. bis 15000.jpg.

Was ich nun bräuchte wäre alle Bilder in einem Ordner zusammen zu haben
sodass die Dateien vom zweiten Ordner dem ersten hinzugefügt werden und
diese bei der letzten Numerierung des ersten Ordners fortfahren, also
mit 30001.jpg, 30002.jpg, 30003.jpg, usw. bis 45000.jpg.

Kann ich sowas mit der shell lösen und wenn ja, wie? Gibt es
andere/essere Lösungen?

Vielen Dank im voraus!

lg, Andreas

mah.. io farei una cosa del genere:

Hier waer ein Skript:

#!/bin/bash

ADIR=a
BDIR=b

for FILE in $BDIR/*; do
     ILE=$(basename $FILE)
     NUM=${ILE%%.jpg}
     let NUM=$NUM+30000
     echo mv $FILE $ADIR/$NUM.jpg
done

Tu es in eine Textdatei x und gib dann ein

chmod 700 x
./x

Das Skript printet dann nur was es tun *wuerde*. Wenn Dich das ueberzeugt,
entferne das "echo" und gib nochmal ./x ein, dann wird das Skript
tatsaechlich ausgefuehrt.

Bye,
Chris.

Hi,

Hallihallo!

Ich bin ziemlich schlecht, was Shellbefehle anbelangt, vielleicht kann
mir jemand von euch helfen.

Ich habe zwei Ordner mit Bilddateien.
Im ersten Ordner sind die Dateien mit Namen 00001.jpg, 00002.jpg,
00003.jpg, usw. bis 30000.jpg.
Im zweiten Ordner sind die Dateien genauso mit Namen 00001.jpg,
00002.jpg, 00003.jpg, usw. bis 15000.jpg.

Das folgende Script macht was du willst, aber 1) no warranty 2) mach
ein backup und paar Proben bevor du das Script auf die aktuellen files
machst.

#!/bin/bash
# Legenda:
# A: dir with 00001.jpg, ... , 30000.jpg (files not to be renamed)
# B: dir with files to be moved and renamed
#LAST: last file in A
LAST=10010

cd A/
for i in *.jpg; do

OLD=${i%.*}
NEW=$((OLD + LAST))
cp -v $i ../B/$NEW.jpg
done
echo "done!"

HTH,
Stefano

Sorry, habe vergessen:

mein script darf mit besondere filenames nicht funktionieren: das ist
wegen "word splitting".

@Armando:

for i in $(ls $SRC_DIR)

Come detto sopra, CFR:
http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29 :slight_smile:

Ciao,
Stefano

certo, ma da come e' stato posto il problema, questo non e' un caso di
cui tenere conto :slight_smile: (sto diventando proprio business.. ahaha)

Cheers,
A.

Erstmal danke für die vielen Antworten, aber irgendwie funktioniert noch
keine Variante, wie ich das bräuchte.

Vielleicht ist es auch mein Fehler in der genauen Beschreibung, denn die
Dateinamen sind nicht reine Zahlen, sonder vor der Zahl sind auch noch
Buchstaben und beginnen mit 0 nicht mit 1, also auf die Art
abc00000.jpg
abc00001.jpg
abc00002.jpg
...
abc30000.jpg

Genauso im zweiten Ordner:
abc00000.jpg
abc00001.jpg
abc00002.jpg
...
abc15000.jpg

Ich weiß nicht, ob das in euren scripts einen Unterschied macht.
Ich möchte, wie gesagt, dass die Dateien vom zweiten Ordner in den
ersten Ordner kopiert werden, wobei die erste Datei aus Ordner2 den
Dateinamen abc30001.jpg, die zweite abc30002.jpg usw. erhält.

lg, Andreas

Ich weiß nicht, ob das in euren scripts einen Unterschied macht.

Aehm.... ja :slight_smile:

Ich trau deiner Beschreibung jetzt nicht mehr.

Kannst du uns die Ausgabe von ls dira
und von ls dirb mailen (magari auch privat?).

Sonst nehmen wir Dinge an, die nicht stimmen
und machen falsche Skripte :wink:

Bye,
Chris.

Ok, also ls Ordner1:

kinomann00000000.bmp
kinomann00000001.bmp
kinomann00000002.bmp
kinomann00000003.bmp
kinomann00000004.bmp
kinomann00000005.bmp
kinomann00000006.bmp
kinomann00000007.bmp
kinomann00000008.bmp
kinomann00000009.bmp
kinomann00000010.bmp
kinomann00000011.bmp
kinomann00000012.bmp
kinomann00000013.bmp
kinomann00000014.bmp
kinomann00000015.bmp
kinomann00000016.bmp
usw. bis
kinomann00031349.bmp

ls Ordner2:
kinomann00000000.bmp
kinomann00000001.bmp
kinomann00000002.bmp
kinomann00000003.bmp
kinomann00000004.bmp
kinomann00000005.bmp
kinomann00000006.bmp
kinomann00000007.bmp
kinomann00000008.bmp
kinomann00000009.bmp
kinomann00000010.bmp
kinomann00000011.bmp
kinomann00000012.bmp
kinomann00000013.bmp
kinomann00000014.bmp
kinomann00000015.bmp
kinomann00000016.bmp
kinomann00000017.bmp
kinomann00000018.bmp
kinomann00000019.bmp
kinomann00000020.bmp
usw. bis
kinomann00002255.bmp

Sorry und danke nochmal!

lg, Andreas

#!/bin/bash

ADIR=Ordner1
BDIR=Ordner2

for FILE in $BDIR/*; do
     NUM=$(basename $FILE | sed "s/[^0-9]//g")
     let NUM=$NUM+31350
     TRG=$(printf "$ADIR/kinomann%08d.bmp" $NUM)
     if [ -f "$TRG" ]; then
         echo "$TRG existiert bereits, ich geb auf"
         exit 1
     fi
     echo mv $FILE $TRG
done

lass wieder das echo weg, nachdem du gesehen hast obs recht ist...

Bye,
Chris.

Hallo Chris,

     erst mal Hut ab, ein Wahnsinn, wenn man sowas kann! ... für mich
ist das ungefähr so verständlich wie chinesische Schreiftzeichen :wink:

Leider gibt es noch eine Fehlermeldung nach der 8. Zeile. Das Script
fängt richtig an, bricht dann aber mit dieser kryptischen Fehlermeldung
ab (zur Info: frames1 und frames2 steht für Ordner1 u. Ordner2, habe ich
im Script angepasst):
./x.sh
mv frames2/kinomann00000000.bmp frames1/kinomann00031350.bmp
mv frames2/kinomann00000001.bmp frames1/kinomann00031351.bmp
mv frames2/kinomann00000002.bmp frames1/kinomann00031352.bmp
mv frames2/kinomann00000003.bmp frames1/kinomann00031353.bmp
mv frames2/kinomann00000004.bmp frames1/kinomann00031354.bmp
mv frames2/kinomann00000005.bmp frames1/kinomann00031355.bmp
mv frames2/kinomann00000006.bmp frames1/kinomann00031356.bmp
mv frames2/kinomann00000007.bmp frames1/kinomann00031357.bmp
./x.sh: Zeile 8: let: NUM=00000008: Der Wert ist zu groß für die
aktuelle Basis. (Fehlerverursachendes Zeichen ist \"00000008\").
./x.sh: Zeile 9: printf: 00000008: Ungültige Oktalzahl.
frames1/kinomann00000000.bmp existiert bereits, ich geb auf

Sagt dir das was?

lg, Andreas

Leider gibt es noch eine Fehlermeldung nach der 8. Zeile.

Ah, ja, shit! In der Shell sind Zahlen die mit 0 beginnen, Oktalzahlen.
Hier, so geht's.

Bye,
Chris.

#!/bin/bash

ADIR=Ordner1
BDIR=Ordner2

for FILE in $BDIR/*; do
     NUM=$(basename $FILE | sed "s/[^0-9]//g")
     NUM=$((10#$NUM))
     let NUM=$NUM+31350
     TRG=$(printf "$ADIR/kinomann%08d.bmp" $NUM)
     if [ -f "$TRG" ]; then
         echo "$TRG existiert bereits, ich geb auf"
         exit 1
     fi
     echo mv $FILE $TRG
done

Das *sind* uebrigens chinesische Schriftzeichen :wink:

In einer "ordentlichen" Sprache waere das weniger kryptisch,
aber du hast wahrscheinlich keine installiert.

Bye,
Chris.

PS: ok, perl hast du wahrscheinlich installiert, aber
es soll boese Menschen geben, die das als noch kryptischer
ansehen... :wink:

Das sind aber boese Menschen :wink:

Bye,
Chris (holt seine Decke).

Wahnsinn! Es funzt!!!

Danke! Danke! Danke!

lg, Andreas

Chris Mair <chris(a)1006.org> ha scritto:

Das sind aber boese Menschen :wink:

Bye,
Chris (holt seine Decke).

Missing quote about perl.
Flame aborted.

:slight_smile:

Daniele