Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : ein script durch mehrere Ordner wandern lassen



boba
07-08-2005, 10:03
Moin,

ich habe mir ein script gebastelt das alle Bilder in einen Ordner resized und dann die Bilder anhand des Ordnernamens umbennent.
Nun würde ich gerne die optione hinzufügen das dieses script durch alle unterverzeichnisse wandelt und sich dann dort ausführt.


#!/bin/bash
#
#pfad=`pwd`
#Oname="$(echo $pfad| sed 's/.*\///' | sed 's/\///g')"

Oname="${PWD##*/}"

ls |while read datei1 ; do /usr/bin/convert -resize 640x480! "$datei1" _"$datei1" ; rm $datei1;done

i=1;
for file in *.png;
do
while [ -f "$Oname"_shot"$(printf "%03d" $i).png" ]
do
((i++))
done
mv $file "$Oname"_shot"$(printf "%03d" $i).png"
done
exit 0

Leider funktioniert das umbennen nur einmal, beim 2ten durchlaug stört es sich an evtl. Leerzeichen die im neuen Namen stehen.
Besten dank an die Autoren der Nummerierungsschleife hier im Forum.

peschmae
07-08-2005, 10:10
Wenn du so wenig wie möglich am Script ändern willst wäre das wohl was in der Art von



WD=$(pwd)
find -type d | while read dir; do
cd $dir
# hier dein Script
cd $WD
done


aber am besten basierst du wohl gleich das komplette Script auf find statt auf einer "for file in *.png"-Schleife - so in die Richtung von



find -type f -name "*.png" - exec tuzeugs {} \;


wobei hier {} von find jeweils durch einen der Dateinamen ersetzt wird, wenn tuzeugs ausgeführt wird.
Aber dann wird natürlich das Script tendentiell etwas anders, weil du dich wohl nicht in dem Ordner befindest, wo die PNGs sind...

MfG Peschmä

boba
07-08-2005, 10:45
super, die erste methode funktioniert nach einer kleinen modifikation.
In die zweite kann ich mich grad noch nicht reindenken.

Leider bestehen noch probleme mit den Leerzeichen in den Dateinamen whärend des umbenenens im letzten abschnitt.
Wo genau müssen die Anführungszeichen hin?
Rein von der Logik her so:
""$Oname"_shot"$(printf "%03d" $i).png""

aber das funzt leider nicht.



#!/bin/bash
#

WD=$(pwd)
find -type d | while read dir; do
cd "$dir"
# ls *.png

# resize
Oname="${PWD##*/}"

ls |while read datei1 ; do /usr/bin/convert -resize 640x480! "$datei1" _"$datei1" ; rm $datei1;done

i=1;
# rename ordnername_shot00x
for file in *.png;
do
while [ -f "$Oname"_shot"$(printf "%03d" $i).png" ]
do
((i++))
done
mv $file "$Oname"_shot"$(printf "%03d" $i).png"
done

cd "$WD"

done
exit 0

peschmae
07-08-2005, 12:01
statt dem

""$Oname"_shot"$(printf "%03d" $i).png""

oder was auch immer sollte eigentlich das hier gehen:

"${Oname}_shot$(printf %03d $i).png"

In der Annahme dass die Variable da Oname ist - und nicht Oname_shot oder nur O ;)

MfG Peschmä

boba
07-08-2005, 14:13
In der jetzigen Form läuft es wunderbar durch,
nur scheint es den convert befehl auch im root ausführen zu wollen:

convert: missing an image filename `_9 Lives'.
rm: Entfernen von „9 Lives“ nicht möglich: Ist ein Verzeichnis
mv: Aufruf von stat für „*.png“ nicht möglich: Datei oder Verzeichnis nicht gefunden


das script hängt dann einige minuten bis es sich beendet.


#!/bin/bash
#

# wechsel in die Ordner
WD=$(pwd)
find -type d | while read dir; do
cd "$dir"
# ls *.png

# resize
Oname="${PWD##*/}"

ls |while read datei1 ; do /usr/bin/convert -resize 640x480! "$datei1" _"$datei1" ; rm "$datei1"; done

i=1;
# rename ordnername_shot00x
for file in *.png;
do
while [ -f "${Oname}_shot$(printf %03d $i).png" ]
do
((i++))
done
mv "$file" "${Oname}_shot$(printf %03d $i).png"
done

cd "$WD"

done
exit 0

peschmae
07-08-2005, 14:47
Ich sehe das Problem gerade auch nicht.

Aber:



for file in *.png;
do
while [ -f "${Oname}_shot$(printf %03d $i).png" ]
do
((i++))
done
mv "$file" "${Oname}_shot$(printf %03d $i).png"
done


könntest du doch auch abkürzen indem du das Zählen in die For-Schleife verschiebst (und falls so Dateien eventuell schon existieren, die while-Schleife *vor* die For-Schleife verlegst).
Dann müsste das while nicht für jede Datei durchgenudelt werden.

MfG Peschmä

Joghurt
07-08-2005, 19:54
Das Problem ist, dass im Resize-Teil "ls" auch Unterverzeichnisse auflistet, welche dann als Bilddateien behandelt werden.
Ersetze ls mal durch find . -type f -depth 0

peschmae
07-08-2005, 21:55
Ach so.
Eigentlich könntest du das ganze convert ja auch in der for f in *.png-Schleife machen, oder? Am besten gleich noch mit dem "richtigen" Dateinamen als Output-Filename.

MfG Peschmä

boba
08-08-2005, 11:54
Ich hab das script mittlerweile dank eurer und der hilfe andere folgendermassen verändert.
Es erstellt jetzt thumbnails für die Bilder und verschieb sie in die passenden Ordner.
Leider kann mein php script nicht mit Leerzeichen umgehen!
Wie könnte ich diese script so abändern das es die dateinamen so erstellt das leerstellen durch unterstriche ersetzt werden?
Am sinnvollsten wär es woll ganz am anfang alle ordner umzubennen.



#!/bin/bash
#

# wechsel in die Ordner
WD=$(pwd)
find -type d | while read dir; do
cd "$dir"
# ls *.png

# resize
Oname="${PWD##*/}"


i=1;
for file in *.png;
do
filename="$Oname""_shot""$(printf "%03d" $i)"".png"
mkdir thumbnails
mkdir shots
mv "$file" tmp_"$file"
/usr/bin/convert -size 240x160 tmp_"$file" -resize 240x160! -type Palette -colors 128 +profile "*" "thumbnails/$filename"
/usr/bin/convert -resize 480x320! -type Palette -colors 128 tmp_"$file" "shots/$filename"
rm tmp_"$filename"
#mv tmp_"$file" shots/"$filename"
#mv "$file" "$filename"
((i++))
done

cd "$WD"

done
exit 0

danke

PS: Ich überlege gerade das es sinnvoller wäre die Dateinamen temporär in php umzubenennen, damit die original namen beibehalten werden

Joghurt
08-08-2005, 15:46
Wie könnte ich diese script so abändern das es die dateinamen so erstellt das leerstellen durch unterstriche ersetzt werden?

filename=${filename// /_}Beachte dir doppelten /