for Schleife cp abarbeiten

L

loptr

Grünschnabel
Heydiho!

Ich schau schon die ganze Zeit im Board, aber wirklich ne Lösung für mein Problemchen hab ich nicht gefunden (wenn auch ne Menge Lösungsansätze :D )

ALSO:

Ich kopiere von nem Server eine (zip) Datei mit massig verzeichnissen und Bildern rüber, vergleiche neue Dateien in der Datenbank und lasse mir eine txt Datei erstellen. Soweit alles jut.
Jetzt will ich auf meinem Rechner nicht immer alle Dateien neu "beabeiten" lassen, sondern nur die, welche in der Datenbankdatei stehen (newimages.txt).
Da die Bilder in einer Ordnerstruktur liegen kopiere ich (bisher) alle Bilder also mit

Code:
find simages/ -name "*.jpg" -exec cp {} images/ \;

nun wollt ich das ganze in eine schleife packen und nur die bilder in der datei kopieren:

Code:
for line in $(cat newimages.txt)
do
find simages/ -name $line -exec cp {} images/ \;
echo "$line"
done

jetzt passiert folgendes: das echo gibt mir alle bildnamen auf den screen, aber kopieren findet nur mit der letzten bilddatei in der newimages.txt statt. alle anderen werden nicht kopiert.

hat jemand nen lösungsansatz für mich?
 
Zuletzt bearbeitet:
WA? 1000 Dank ... zeilenweise lesen ist natürlich auch mal ne Idee...
hab bis jetzt immer nach cp find usw. gesucht. :D manchmal gehts auch leicht ;-)
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

So, jetzt häng ich ne Stunde dran und habe immer wieder das selbe gefunden - while und for alles ausprobiert. but the problem is the same ^^
 
Zuletzt bearbeitet:
Hi,

am besten solltest du auch mal einen Auszug der Datei zeigen, und wie denn die Ordner Struktur aussieht, denn ich sehe z.B. den Sinn von find nicht.

Nebenbei waere es gut wenn du Code-Tags fuer Quellcode benutzen wuerdest, das macht deine Posts deutlich lesbarer.

mfg,
bytepool
 
HA! Da gibts ja sogar nen Code Tag :brav:

Also .. das ist der Code der Datei (die wichtigen Sachen, davor ist nur wget & unzip):

Code:
for line in $(cat newimages.txt)
do
find simages/ -name $line -exec cp {} images/ \;
echo "$line"
done

die Datei sieht so aus (ich schreibs auch mal in Code, weil besser lesbar):

Code:
0001234.jpg
0012345.jpg
0123456.jpg

Ordnerstruktur ist so:

/simages/00/0001/01234.jpg
/simages/00/0010/0012345.jpg
/simages/01/0123/0123456.jpg

des weiteren existieren noch andere Ordner/Dateien wie:
/simages/10/1011/1011234.jpg
oder
/simages/61/6145/6145789.jpg

(sind ca. 5.000 Dateien - nur so als Richtwert)

Ich habe auch schon versucht, mal das unzip der Datei simages.zip auf eine Dateiebene zu bringen (also dass alles *.jpg Dateien in /simages drin liegen), aber dazu auch nix gefunden. dann wäre das find überflüssig und ich benötigte nur das cp (quält den PC dann auch nicht so) :-)
 
Hi,

ich muss gestehen dass ich so auf Anhieb auch nicht sehe was das Problem ist. Ich wuerde das ganze etwa so schreiben:

Code:
while read line; do
  find ./simages/ -name "$line" -exec echo {} images/ '+'
done < newimages.txt
Wenn das die erwuenschte Ausgabe ergibt, echo einfach durch cp ersetzen. Eventuell solltest du versuchen absolute Pfadnamen zu benutzen.

Ich habe auch schon versucht, mal das unzip der Datei simages.zip auf eine Dateiebene zu bringen (also dass alles *.jpg Dateien in /simages drin liegen), aber dazu auch nix gefunden. dann wäre das find überflüssig und ich benötigte nur das cp (quält den PC dann auch nicht so) :-)

'man unzip' sagt dass 'unzip -j' die Ordnerstruktur eigentlich ignorieren sollte, und alles im selben Ordner auspackt.

mfg,
bytepool
 
HA! Das unzip hat funktioniert. jetzt hab ich im Stammverzeichnis nen haufen dateien drin. komischerweise hab ich das auch schon probiert (--help), aber resultat war = 0

Ich werd jetzt mal das find weglassen und nur cp benutzen. vllt funzt das.

die while schleife hatte ich auch schon ausprobiert, funktionierte nix (was wirklich an absoluten pfaden hängen kann, denn das hatte ich nirgends, weil die for ja gefunzt hat).

Danke erstmal. ich meld mich wieder (mit lösung zur vollständigkeit oder frage :D )
 
OHA! Da isser wieder.
Also ein kleines Update mit Bitte um (erneute) :hilfe2:

Mein Scrips sieht mittlerweile so aus, dass ich alle find und cp entfernt habe.
Also entzippe direkt die Dateien.

Jetzt funktioniert der (statische) Code ganz fantastisch:
Code:
#unzip -j ./content.zip simages/062/06213/0621352.jpg -d ./images/
#unzip -j ./content.zip simages/062/06213/0621356.jpg -d ./images/
#unzip -j ./content.zip simages/062/06213/0621351.jpg -d ./images/
#unzip -j ./content.zip simages/061/06143/0614334.jpg -d ./images/
#unzip -j ./content.zip simages/061/06143/0614317.jpg -d ./images/
#unzip -j ./content.zip simages/061/06143/0614329.jpg -d ./images/

Allerdings - sobald ich das in eine Schleife (while und for) reinpacke entpackt er die letzte Datei, allerdings keine vorher.
Code:
for line in $(cat newimages.txt)
do
strf=simages/`expr substr $line 1 3`/`expr substr $line 1 5`/$line
unzip -j ./content.zip $strf -d ./images/
done

Datei sieht noch so aus wie vorher, ob Dateien im Archiv sind habe ich gecheckt (alle vorhanden).
Habe schon probiert:
- absolute Pfade
- IFS
- cat $file | while read line
- while -> done $file

Absolut mit nix hat es funktioniert :(
 
Problem gelöst

Es waren noch Windows Zeilenumbrüche in der newimages.txt Datei.

entfernen mit

dos2unix -a newimages.txt

und schon läuft die Sache.

Danke trotzdem @bytepool
 

Ähnliche Themen

Dateien verschieben + Zeitstempel anhängen mit Hilfe einer for - Schleife

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Max_Args trotz for-Schleife überschritten...

Ordnerdurchlauf for-Schleife & find MIT Leerzeichen

bash: Fehlermeldung und Werte in Array sortieren?

Zurück
Oben