Kopierscript gesucht ...

kangaroo72

Forums-Beuteltier²
Themenstarter
Registriert
2 Mai 2007
Beiträge
2.033
Hallo Leute,

da ich leider keine Programmierkenntnisse habe, und noch keine Lösung gefunden habe, hier mal eine Frage ob jemand eine Idee hat :eek:

Also … ich hab 1200 Ordner in einer Directory … in jedem Ordner liegt eine „background.jpg“
Jetzt hätte ich gerne die 1200 jpg’s in einen Ordner kopiert, sodass sie automatisch in den Ordnernamen umbenannt werden.

Beispiel:

/Ordner1/background.jpg
/Ordner2/background.jpg
/Ordner3/background.jpg

Ziel:

/Zielordner/Ordner1.jpg
/Zielordner/Ordner2.jpg
/Zielordner/Ordner3.jpg

Der Zielordner soll immer der gleiche sein …

Sowas geht doch bestimmt mit einem kleinen Skript, oder?

Grüße,

Kangaroo
 
for (i=1, i=1200, i++)
{
copy C:\/Ordner/background.jpg C:\Zielordner/Ordner.jpg
}

sowas inner art, ABER die Ordner heißen sicher anders, oder? Dann müsste das Program eine Datenbank haben mit der es arbeiten kann, willst du diese anlegen? ;)
 
Zuletzt bearbeitet:
Hi Adun,

yo - die Ordner haben die wildesten Namen ... nicht numeriert ...
 
Adun, das was du da hast, das ist ne for und keine while-Schleife, glaube ich! :eek: *Kulgscheißermodus ein*
Aber da haste natürlich recht mit der Datenbank. Aber alle Unterordner eines Ordners müsste man auch anderes erreichen können, nur ich weiß im Moment auch nicht wie. ._.
 
um welches os geht es denn eigentlich? die schreibweise der pfade deutet eher auf linux oder so hin.
 
Mein Vorschlag in quick 'n dirty:

EDIT: Geht so nicht, siehe überarbeitete Version unten!


Code:
QUELLE="/"
ZIEL="/Zielordner"

for i in $(find $QUELLE -type d)
do
    cp $QUELLE/background.jpg $ZIEL/i.jpg
done

Grüße

Fabian
 
Zuletzt bearbeitet:
@ tapf! - Die Quelle ist sind 1200 verschiedene Ordner - in Deinem Script ist nur von einer Quelle die Rede, oder?
 
nein, find liefert in diesem fall alle verzeichnisse in "QUELLE". QUELLE und ZIEL musst du natürlich anpassen.
 
Bekomme immer den hier ...

Code:
cp: Aufruf von stat für „/test/background.jpg“ nicht möglich: Datei oder Verzeichnis nicht gefunden

Und zwischen test und background fehlen noch die eigentlichen Ordner ...

Hab das Skript so angepasst ...

Code:
QUELLE="/test"
ZIEL="/test2"

for i in $(find $QUELLE -type d)
do
    cp $QUELLE/background.jpg $ZIEL/i.jpg
done
 
Zuletzt bearbeitet:
das klingt als ob /test leer ist. hast du die testverzeichnisse tatsächlich direkt in / angelegt? :huh:
oder liegen die daten woanders, wie z.b. in deinem home-verzeichnis. ich vermute hier ein kleines missverständnis.
 
Die Daten liegen in /test/ordner1/background.jpg /test/ordner2/background.jpg usw.

habe in /test mal 20 Ordner abgelegt, und in diesen Ordnern liegt die background.jpg
 
Ich hab meinen Vorschlag grad mal getestet und musste ihn etwas korrigieren. Anbei die getestete V2:

Code:
!/bin/bash

QUELLE="/test"
ZIEL="/test2"

[COLOR=#a9a9a9]echo "QUELLE: $QUELLE"
echo "ZIEL: $ZIEL"[/COLOR]

for i in $(find $QUELLE -type d)
do
[COLOR=#a9a9a9]        echo "Ordner: $i"[/COLOR]
        relativePath="$(echo "$i" | sed "s|$QUELLE||g")
        cp $i/background.jpg $ZIEL/$relativePath.jpg
done

Grüße

Fabian
 
Zuletzt bearbeitet:
Jetzt erkenne ich auch das Problem ...

Blanks und Sonderzeichen wie () in den Ordnern ... :pinch:
 
Und ich geh erstmal mützen ... muss wieder früh raus - Danke schonmal für eure super Unterstützung :eek:
 
An Leerzeichen im Ordnername habe ich garnicht gedacht :pinch:, aber V3 meistert auch diese.

Code:
#!/bin/bash

QUELLE="/test"
ZIEL="/test2"

[COLOR=#a9a9a9]echo "QUELLE: $QUELLE"
echo "ZIEL: $ZIEL"[/COLOR]

for i in $(find $QUELLE -type d | sed 's/ /__blank__/')
do
[COLOR=#a9a9a9]         echo "Ordner: $i"[/COLOR]
        relativePath="$(echo "$i" | sed "s|"$QUELLE"||g" | sed 's/__blank__/ /g')"
        cp $QUELLE/"$relativePath"/background.jpg $ZIEL"$relativePath".jpg
done

Die Lösung für die Leerzeichen ist nicht wirklich elegant (werden temporär durch "__blank__" ersetzt, sodass sie die for-Schleife nicht mehr beachtet), aber so spart man sich an den Delimitern des Systems rumzupfuschen.

Grüße

Fabian
 
Zuletzt bearbeitet:
Um mit den Leerzeichen und Sonderzeichen klar zu kommen musst du quoten.

D.h. um die Dateinamen Anführungszeichen setzten.

cp "$i/background.jpg" "$ZIEL/$relativePath.jpg"

Wenn ich die Frage richtig verstanden habe könnte ein simples ls anstelle des find genügen und man müsste das $Quelle nicht weg machen ;-)
 
Stimmt, solange es keine weiteren Unterordner gibt, sollte auch ein ls gehen. Problematisch bleibt die for-Schleife mit den Leerzeichen. Mit
Code:
ls | sed -e 's/$/"/' -e 's/^/"/'
konnte ich die Foldernames zwar in Quotes setzen, jedoch werden sie als normale Zeichen weiterverarbietet (find trennt trotzdem am Leerzeichen und cp sucht sie im Dateinamen):

Code:
serv# ls test
bier    foo bar
serv# sh t
QUELLE: test
ZIEL: test2
Ordner: "bier"
cp: "bier"/background.jpg: No such file or directory
Ordner: "foo
cp: "foo/background.jpg: No such file or directory
Ordner: bar"
cp: bar"/background.jpg: No such file or directory

Grüße

Fabian
 
Langsam verlier ich den Überblick ... also eine 100% Lösung war noch nicht dabei, oder? :love:

Grüße,

Kangaroo
 
Wie gesagt mit quoten bekommt man das in den Griff.
Ich schau mal nach wie das klappt.
 
  • ok1.de
  • ok2.de
  • thinkstore24.de
  • Preiswerte-IT - Gebrauchte Lenovo Notebooks kaufen

Werbung

Zurück
Oben