1tes Script - Kommandweitergabe von find an cp & convert

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
chri7
Beiträge: 35
Registriert: 12.03.2007 20:40:02

1tes Script - Kommandweitergabe von find an cp & convert

Beitrag von chri7 » 07.11.2007 13:41:19

Hi Leute,

bisher kam ich immer gut ohne Scripte durchs leben, aber jetzt benötige ich doch ein Script um etwas zu erledigen :)

Ich habe eine Ordnerstruktur:
Photoordner - Unterordner - mehr Unterordner - Bilder

nun will ich diesen Photoordner kopieren und dabei alles in jpeg mit 75% convertieren, ein logo einfügen und die Bilder auf 1000px Breite skaliere.

Das ist alles mit find und convert zu regeln, leider bekomme ich die find Ergebnisse nicht an cp übergeben, daher meine Fragen:

Wenn ich foldendes tue:

Code: Alles auswählen

find * | grep -i '.jpg$'
bekomme ich eine Auslistung mit einem Bild und vollem Pfad pro Zeile - wunderbar!

Code: Alles auswählen

   unsere erste LanParty 1996/r01000025_2.jpg
unsere erste LanParty 1996/r0100035_2.jpg
unsere erste LanParty 1996/r0100044.jpg
unsere erste LanParty 1996/r0100054.jpg
unsere erste LanParty 1996/r0100031.jpg
unsere erste LanParty 1996/r0100006.jpg
unsere erste LanParty 1996/r0100054_2.jpg
unsere erste LanParty 1996/r0100028_2.jpg
unsere erste LanParty 1996/r0100028.jpg
 
mach ich jetzt aber daraus folgendes:

Code: Alles auswählen

for file in $(find * | grep -i '.jpg$'); do echo ">>>>>   ${file}   <<<<<"; done
bekomme ich pro Wort des Dateinamens ein Argument in der Schleife *agressgrig*!
Das will ich aber nicht, ich will pro Schleifendurchlauf den _kompletten_ Pfad haben - nicht nur ein Wort ....

Code: Alles auswählen

   >>>>>   unsere   <<<<<
>>>>>   erste   <<<<<
>>>>>   LanParty   <<<<<
>>>>>   1996/r0100028.jpg   <<<<<
>>>>>   unsere   <<<<<
>>>>>   erste   <<<<<
>>>>>   LanParty   <<<<<
>>>>>   1996/r0100051_2.jpg   <<<<<
>>>>>   unsere   <<<<<
>>>>>   erste   <<<<<
>>>>>   LanParty   <<<<<
>>>>>   1996/r0100009.jpg   <<<<<

Wenn das dann läuft habe ich eine Frage zu cp:
Wie kann ich cp beim kopieren nicht vorhandene Pfade anlegen lassen. Das muss ja irgendwie gehen oder?
Also wenn er ein Bild aus einem Ordner kopieren soll, dann müssen alle Unterordner im Zielverzeichnis erst erzeugt werden ... geht das mit cp irgendwie?


danke shconmal im vorraus - mensch bin ich froh wenn das endlich funktioniert ;P

Christian

Benutzeravatar
markus_b
Beiträge: 355
Registriert: 26.01.2006 04:57:18
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von markus_b » 07.11.2007 14:33:26

Also das mit den Leerzeichen in den Pfaden kannst du quick&dirty lösen, indem du die IFS Variable auf den Zeilenumbruch setzt:

Code: Alles auswählen

IFS="
"
Alternativ kannst du auch das -exec Kommando von find verwendet (Doku dazu gibts in info find) oder du musst das pipen (evetuell mit -print0).

Code: Alles auswählen

find * | irgendein-kommando
find * -print0 | xargs -0 irgendein-kommando
Oder du machst das mit read:

Code: Alles auswählen

find * | while read f; do echo $f; done
Zu deiner zweiten Frage: Wenn ein Verzeichnis nicht existiert, dann musst du es halt vorher mit mkdir anlegegen.

Ansonsten lohnt es sich, die Man-Pages zu lesen:

Code: Alles auswählen

man bash
info find
man xargs
man cp
man mkdir

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 07.11.2007 14:34:01

Hi,

find hat eine Option "-exec", das sollte dein Problem loesen, da ich aber gerade kein Linux zur Hand habe, kann ich's nicht testen. Wenn es sich um sehr viele Dateien handelt, die du so an cp uebergibst, bekommst du allerdings irgendwann Probleme. Frag aber bitte nicht ab wann, das kann ich auch nur suchen. Wenn das passiert ist xargs dein Freund.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Antworten